阿里消息中间件,和rabbitMQ相比实现并发量更高,响应速度更短,和kafka相比相同量级占用资源更小。基本结构如下:
消息种类包括
** 顺序消息**: defaultMQProducer.send() 注意选择重载send,需要通过匿名内部类 MessageQueueSelector的方式,就是选择一个消息队列
集群消息:一个消息只能被一个消费者实例所消费
广播消息:每一条消息都会被不同消费者所消费
延迟消息:如果是延迟消息临时存储, 根据delay service 服务去检查是否到达时间,如果到达时间就会发送到目标topic中去 临时队列为(SCHEDULE_TOPIC_XXXX)不同延迟级别会对应不同的队列序号,当延迟时间到之后由定时线程负责处理
事务消息:消息队列 RocketMQ 版提供类似 X/Open XA 的分布式事务功能,通过消息队列 RocketMQ 事务消息能达到分布式事务的最终⼀致。
发送步骤:
- 发送⽅将半事务消息发送⾄消息队列 RocketMQ 版服务端。
- 消息队列 RocketMQ 版服务端将消息持久化成功之后,向发送⽅返回 Ack 确认消息已经发送成功,此时消息为半事务消息。
- 发送⽅开始执⾏本地事务逻辑。
- 发送⽅根据本地事务执⾏结果向服务端提交⼆次确认(Commit 或是 Rollback),服务端收到 Commit 状态则将半事务消息标记为可投递,订阅⽅最终将收到该消息;服务端收到 Rollback 状 态则删除半事务消息,订阅⽅将不会接受该消息。
事务消息回查步骤如下:
1.在断⽹或者是应⽤重启的特殊情况下,上述步骤 4提交的⼆次确认最终未到达服务端,经过固定时间后服务端将对该消息发起消息回查。
2.发送⽅收到消息回查后,需要检查对应消息的本地事务执⾏的最终结果。
3.发送⽅根据检查得到的本地事务的最终状态再次提交⼆次确认,服务端仍按照步骤
4.对半事务消息进⾏操作。
拓展:DDMQ 在消息中间件前加了层代理,代理发送给缓冲区,延迟服务负责判断是否生效 ,生效放到目标topic中