有序消息
有序消息
有序消息又叫顺序消息(FIFO消息)
是指消息的消费顺序和生产顺序相同,在有些业务逻辑下,必须保证顺序。
比如订单的生成、付款、发货,这个消息必须按照顺序处理才行。
顺序消息分为全局顺序和分区顺序
全局顺序
一个Topic内所有的消息都发送到同一个queue,按照先进先出的顺序进行发布和消费
使用场景:性能要求不高,所有的消息严格按照FIFO原则进行消息发布和消费的场景。
分区顺序
对于指定的一个Topic,所有消息根据sharding key进行区块(queue)分区
同一个queue内的消息按照严格的FIFO顺序进行发布和消费
Sharding key是顺序消息中用来区分不同分区的关键字段,和普通消息的key是完全不同的概念。
使用场景:性能要求高,根据消息中的sharding key去决定消息发送到哪一个queue。
区局消息和分区顺序对比
- 消息类型对比
消息类型 | 支持事务消息 | 支持定时消息 | 性能 |
---|---|---|---|
无序消息(普通、事务、定时/延时消息) | 是 | 是 | 最高 |
分区顺序消息 | 否 | 否 | 高 |
全局顺序消息 | 否 | 否 | 一般 |
- 发送方式对比
消息类型 | 支持可靠同步发送 | 支持可靠异步发送 | 支持Oneway发送 |
---|---|---|---|
无序消息(普通、事务、定时/延时消息) | 是 | 是 | 是 |
分区顺序消息 | 是 | 否 | 否 |
全局顺序消息 | 是 | 否 | 否 |
保证消息顺序
在MQ的模型中,顺序需要由3个阶段去保障:
1.消息被发送时保持顺序
2.消息被存储时保证和发送的顺序一致
3.消息被消费时保持和顺序的顺序一致
rocketMQ顺序消息的实现
RocketMQ消费端有两种类型:MQPullConsumer和MQPushConsumer。
本质上底层都是通过pull机制去实现,pushConsumer是一种API封装。
MQPullConsumer是由用户控制线程,主动从服务端获取消息,每次获取到的是一个MessageQueue中的消息。
PullResult中的List<MessageExt> msgFoundList自然和存储顺序一致,用户需要再拿到这批消息后自己保证消费的顺序。
MQPushConsumer由用户注册MessageListener来消费消息,在客户端中需要保证调用MessageListener时消息的顺序性(长轮询)
有序消息的缺陷
-
发送顺序消息无法利用集群的Failover特性,因为不能更换MessageQueue进行重试
-
因为发送的路由策略导致的热点问题,可能某一些MessageQueue的数据量特别大
-
消费的并行读依赖于queue数量
-
消费失败时无法跳过
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步