一. 普通消息
- 同步发送消息
同步发送消息是指,Producer发出⼀条消息后,会在收到MQ返回的ACK之后才发下⼀条消息。该方式的消息可靠性最高,但消息发送效率太低。
- 异步发送消息
异步发送消息是指,Producer发出消息后无需等待MQ返回ACK,直接发送下⼀条消息。该方式的消息可靠性可以得到保障,消息发送效率也可以。
- 单向发送消息
单向发送消息是指,Producer仅负责发送消息,不等待、不处理MQ的ACK。该发送方式时MQ也不返回ACK。该方式的消息发送效率最高,但消息可靠性较差。
二. 顺序消息
顺序消息指的是,严格按照消息的发送顺序进行消费的消息(FIFO)。
-
全局有序
当发送和消费参与的Queue只有一个时所保证的有序是整个Topic中消息的顺序, 称为全局有序。
-
分区有序
如果有多个Queue参与,其仅可保证在该Queue分区队列上的消息顺序,则称为分区有序。
在定义Producer时指定实现了MessageQueueSelector接口的消息队列选择器;在定义选择器的选择算法时,一般需要使用选择key,这个key是自定义的不可重复的。
顺序选择算法:取模算法,让选择器key(或其hash值)与该Topic所包含的Queue的数量取模,其结果即为选择出的Queue的QueueId。如出现相同的QueueId,则从消息中获取到选择key,对其进行判断,若是当前Consumer需要消费的消息,则直接消费,否则,什么也不做。这种做法要求选择key要能够随着消息一起被Consumer获取到。
三.延时消息
当消息写入到Broker后,在指定的时长后才可被消费处理的消息,称为延时消息。
四.事务消息
- TC(Transaction Coordinator),事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚。RocketMQ中Broker充当着TC。 - TM(Transaction Manager),事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。它实际是全局事务的发起者。RocketMQ中事务消息的Producer充当着TM。 - RM(Resource Manager),资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。RocketMQ中事务消息的Producer及Broker均是RM。
- TM向TC发起指令,开启一个全局事务。
- 根据业务要求,各个TC会通知RM注册分支事务,然后TC会逐个向RM发出预执行指令。
- 各个RM在接收到指令后会在进行本地事务预执行。
- RM将预执行结果Report给TC。当然,这个结果可能是成功,也可能是失败。
- TC在接收到各个RM的Report后会将汇总结果上报给TM,根据汇总结果TM会向TC发出确认指令。若所有结果都是成功响应,则向TC发送Global Commit指令。只要有结果是失败响应,则向TC发送Global Rollback指令。
- TC在接收到指令后再次向RM发送确认指令。
五.死信队列
一条消息初次消费失败,消息队列会自动进行消费重试;达到最大重试次数后,若消费依然失败,则将其发送到该消费者对应的死信队列中,其中的消息则称为死信消息。