一、RocketMQ简介
1.1、概述
RocketMQ是阿里巴巴旗下一款开源的消息中间件,2016年11月28日,阿里巴巴向Apache软件基金会捐赠RocketMQ,成为Apache孵化项目,2017年9月25日,Apache宣布RocketMQ孵化成为Apache顶级项目(TLP),成为国内首个互联网中间件在Apache上的顶级项目。
1.2、发展历程
1.3、特点
(1)能够保证严格的消息顺序;
(2)提供丰富的消息拉取模式;
(3)高效的订阅者水平扩展能力;
(4)实时的消息订阅机制;
(5)亿万级消息堆积能力;
1.4、异步处理消息
消息发送者可以发送一个消息而无需等待消费者的响应。发送者把消息发送到一条虚拟的通道(主题或队列)上,消息接收者则订阅或监听该通道。一条消息可能最终转发给一个或者多个消费者,这些接收者都无需对消息发送者做出回应,整个过程都是异步的。
案例:系统A和系统B通信。系统A希望发送一条消息给系统B,让它去处理,但是系统A并不关注系统B到底怎么处理或者有没有处理好,也就是说系统A把消息发送给MQ后,就不管这条消息的"死活"了,接着系统B从MQ里面消费消息即可。至于怎么处理,是否处理完毕,什么时候处理完毕,都是系统B的事情了,与系统A无关。这样的一种通信方式就是所谓的"异步"通信方式,对于系统A来说,只要把消息发送给MQ,然后系统B就会去异步处理了,系统A不会"同步"的等待系统B的响应。这样的好处是什么呢?解耦!大概的流程可能如下:
再举一个生活中的例子:对讲机、网上商城购物下订单等
1.5、基本概念
1.5.1、消息(Message)
消息是指,消息系统所传输信息的物理载体,是生产和消费数据的最小单位,每条消息必须属于某一个主题。
1.5.2、主题(Topic)
Topic表示一类消息的集合,每个主题包含若干条消息,每条消息只属于某一个主题,是RocketMQ进行消息订阅的基本单位。topic:message 1:n、message:topic 1:1。一个生产者可以同时发送多种Topic的消息,producer:topic 1:n 、consumer:topic 1:1
1.5.3、标签(Tag)
为消息设置的标签,用于同一主题下区分不同类型的消息。来自同一业务单元的消息,可以根据不同业务目的在同一主题下设置不同的标签。标签能够有效地保持代码的清晰度和连贯性,并优化RocketMQ提供的查询系统。消费者可以根据Tag实现不同子主题的不同消费逻辑,实现更好的扩展性。
Topic = 货物 Tag = 上海
Topic = 货物 Tag = 上海|浙江
Topic = 货物 Tag = *
1.5.4、队列(Queue)
存储消息的物理实体。一个Topic中可以包含多个Queue,每个Queue中存放的就是该Topic的消息。一个Topic中的Queue也被称为一个Topic中的消息分区(Partition)。
1.5、重要组件
(一)Producer
消息的生产者,发送者,可以类比为寄信人。
(二)Consumer
消息的消费者,接收者,可以类别为收信人。
(三)Broker
暂存和传输消息的通道,可以类比为快递公司。
(四)Queue
队列,消息存放的位置,一个Broker中可以有多个队列,可以类别为快递公司的各个货架。
(五)Topic
主题,可以类比为消息的种类。
(六)ProducerGroup
生产者组。
(七)ConsumerGroup
消费者组,多个消费者组可以同时消费一个主题的消息。
(八)NameServer
(1)NameServer是一个几乎无状态的节点,可以集群部署,节点之间无任何信息同步;
(2)NameServer 是整个 RocketMQ 的“大脑” ,它是 RocketMQ 的服务注册中心,所以 RocketMQ 需要先启动 NameServer,再启动Broker(先有公司,再有部门)
1.6、发送 & 接收消息
Producer询问NameServer,NameServer分配一个Broker给Producer,接着Producer就可以往Broker中发送消息了,然后Consumer消费消息之前也要询问NameServer,得到一个具体的Broker,然后消费消息,大致流程图如下: