一、 rocketmq是什么,能做什么,在什么场景下使用
首先简单了解一下什么是消息中间件。
在系统开发中,当请求在短时间内很多的时候,服务处理不过来的时候,对于新请求,可以直接拒绝不处理,可以立即处理,也可以把请求存储到一个容器里,这个容器一般选择队列来实现。也就是说,把请求先存放到队列里,一个一个的处理,就好比在学校饭堂里打饭,阿姨同一时间只能给一个同学打饭,当有很多学生要打饭的时候,就加入排队的队列里。如果把学生映射成客户端发送过来的请求消息,那么排队的队伍就是软件开发中的队列。这就是一个消息队列。当有很多个消息队列存在的时候,我们就需要有一种管理这些队列的机制,保证队列的可靠性,同时,为了方便我们开发人员不用重复的编写创建队列,销毁队列,消息入队出队这些和业务逻辑无关的代码,需要把这些无关的代码抽出去封装起来成为一种工具,开发人员只需要在系统内引入这个工具,就能快速实现消息处理功能的开发。这种工具就是消息中间件。
总结起来,消息中间件是基于队列与消息传递技术,在网络环境中为应用系统提供同步或异步、可靠的消息传输的支撑性软件系统。消息中间件,在开发上常见的消息中间件要有几个,kafka,ActiveMQ,RabbitMQ,RocketMQ。这篇文章讲的是RocketMQ。
几种消息中间件的比较,有网友总结如下:
rocketmq是阿里巴巴开发的一个消息中间件。它能满足分布式系统对高性能、高吞吐量的要求,在电商领域具有很高的声誉,经过十多年的打怪升级,RocketMQ 已经成为业内共识的金融级可靠业务消息首选方案,被广泛应用于互联网、大数据、移动互联网、物联网等领域的业务场景。现在已经被阿里捐献给了Apache基金会。
二、可以根据各自的特点和实际场景进行选择:
用户访问量在ActiveMQ的可承受范围内,而且确实主要是基于解耦和异步来用的,可以考虑ActiveMQ,也比较贴近Java工程师的使用习惯。
RabbitMQ结合了erlang语言本身的并发优势,性能较好,社区活跃度也比较高,可以快速解决开发过程中遇到的bug,但是不利于做二次开发和维护。
RockeMQ天生为金融互联网领域而生,对于可靠性要求很高的场景,尤其是电商里面的订单扣款,以及业务削峰,在大量交易涌入时,后端可能无法及时处理的情况。RoketMQ在稳定性上更值得信赖,这些业务场景在阿里双11已经经历了考验,如果业务有上述并发场景,建议可以选择RocketMQ。
kafka一开始的目的就是用于日志收集和传输,主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,适合产生大量数据的互联网服务的数据收集业务。大型公司建议可以选用,如果有日志采集功能,首选kafka。
三、基本概念:
重点关注:topic主题,MessageType消息类型,MessageQueue消息队列,Message 消息,Producer 生产者,Consumer消费者
1.topic主题:
是RocketMQ 中消息传输和存储的顶层容器,用于标识同一类业务逻辑的消息。主题通过TopicName来做唯一标识和区分。
2.MessageType消息类型:
RocketMQ 中按照消息传输特性的不同而定义的分类,用于类型管理和安全校验。 RocketMQ 支持的消息类型有普通消息、顺序消息、事务消息和定时/延时消息。
RocketMQ 从5.0版本开始,支持强制校验消息类型,即每个主题Topic只允许发送一种消息类型的消息,这样可以更好的运维和管理生产系统,避免混乱。但同时保证向下兼容4.x版本行为,强制校验功能默认关闭,推荐通过服务端参数enableTopicMessageTypeCheck 手动开启校验。
3.MessageQueue消息队列:
队列是 RocketMQ 中消息存储和传输的实际容器,也是消息的最小存储单元。RocketMQ 的所有主题都是由多个队列组成,以此实现队列数量的水平拆分和队列内部的流式存储。队列通过QueueId来做唯一标识和区分。
4.Message 消息
消息是 Apache RocketMQ 中的最小数据传输单元。生产者将业务数据的负载和拓展属性包装成消息发送到服务端,服务端按照相关语义将消息投递到消费端进行消费。
5.MessageView消息视图
消息视图是 Apache RocketMQ 面向开发视角提供的一种消息只读接口。通过消息视图可以读取消息内部的多个属性和负载信息,但是不能对消息本身做任何修改。
6.MessageTag消息标签
消息标签是Apache RocketMQ 提供的细粒度消息分类属性,可以在主题层级之下做消息类型的细分。消费者通过订阅特定的标签来实现细粒度过滤。
7.MessageQueueOffset消息位点
消息是按到达Apache RocketMQ 服务端的先后顺序存储在指定主题的多个队列中,每条消息在队列中都有一个唯一的Long类型坐标,这个坐标被定义为消息位点。
8.ConsumerOffset消费位点
一条消息被某个消费者消费完成后不会立即从队列中删除,Apache RocketMQ 会基于每个消费者分组记录消费过的最新一条消息的位点,即消费位点。
9.MessageKey消息索引
消息索引是Apache RocketMQ 提供的面向消息的索引属性。通过设置的消息索引可以快速查找到对应的消息内容。
10.Producer 生产者
生产者是Apache RocketMQ 系统中用来构建并传输消息到服务端的运行实体。生产者通常被集成在业务系统中,将业务消息按照要求封装成消息并发送至服务端。
11.TransactionChecker事务检查器
Apache RocketMQ 中生产者用来执行本地事务检查和异常事务恢复的监听器。事务检查器应该通过业务侧数据的状态来检查和判断事务消息的状态。
12.TransactionResolution 事务状态(
Apache RocketMQ 中事务消息发送过程中,事务提交的状态标识,服务端通过事务状态控制事务消息是否应该提交和投递。事务状态包括事务提交、事务回滚和事务未决。
13.ConsumerGroup消费者分组
消费者分组是Apache RocketMQ 系统中承载多个消费行为一致的消费者的负载均衡分组。和消费者不同,消费者分组并不是运行实体,而是一个逻辑资源。在 Apache RocketMQ 中,通过消费者分组内初始化多个消费者实现消费性能的水平扩展以及高可用容灾。
14.Consumer消费者
消费者是Apache RocketMQ 中用来接收并处理消息的运行实体。消费者通常被集成在业务系统中,从服务端获取消息,并将消息转化成业务可理解的信息,供业务逻辑处理。
- ConsumeResult消费结果
Apache RocketMQ 中PushConsumer消费监听器处理消息完成后返回的处理结果,用来标识本次消息是否正确处理。消费结果包含消费成功和消费失败。
16.Subscription订阅关系
订阅关系是Apache RocketMQ 系统中消费者获取消息、处理消息的规则和状态配置。订阅关系由消费者分组动态注册到服务端系统,并在后续的消息传输中按照订阅关系定义的过滤规则进行消息匹配和消费进度维护。
17.消息过滤
消费者可以通过订阅指定消息标签(Tag)对消息进行过滤,确保最终只接收被过滤后的消息合集。过滤规则的计算和匹配在Apache RocketMQ 的服务端完成。
18.重置消费位点
以时间轴为坐标,在消息持久化存储的时间范围内,重新设置消费者分组对已订阅主题的消费进度,设置完成后消费者将接收设定时间点之后,由生产者发送到Apache RocketMQ 服务端的消息。
19.消息轨迹
在一条消息从生产者发出到消费者接收并处理过程中,由各个相关节点的时间、地点等数据汇聚而成的完整链路信息。通过消息轨迹,您能清晰定位消息从生产者发出,经由Apache RocketMQ 服务端,投递给消费者的完整链路,方便定位排查问题。
20.消息堆积
生产者已经将消息发送到Apache RocketMQ 的服务端,但由于消费者的消费能力有限,未能在短时间内将所有消息正确消费掉,此时在服务端保存着未被消费的消息,该状态即消息堆积。
21.事务消息
事务消息是Apache RocketMQ 提供的一种高级消息类型,支持在分布式场景下保障消息生产和本地事务的最终一致性。
22.定时/延时消息
定时/延时消息是Apache RocketMQ 提供的一种高级消息类型,消息被发送至服务端后,在指定时间后才能被消费者消费。通过设置一定的定时时间可以实现分布式场景的延时调度触发效果。
23.顺序消息
顺序消息是Apache RocketMQ 提供的一种高级消息类型,支持消费者按照发送消息的先后顺序获取消息,从而实现业务场景中的顺序处理。