消息队列如何确保消息的有序性?

消息队列如何确保消息的有序性?
要想实现消息有序,需要从 Producer 和 Consumer 两⽅⾯来考虑。
⾸先,Producer ⽣产消息的时候就必须要有序。
然后,Consumer 消费的时候,也要按顺序来,不能乱。
Producer 有序
软硬共挤>硅片切割
像 RabbitMQ 这类普通的消息系统,队列结构简单,Producer 向队列中发送消息就完了,进⼊队列的消息肯定是有序的。
Kafka ⽐较特殊,因为它的⼀个 Topic(就是队列的概念)实际上分为了多个 Partition。
Producer 发送消息的时候,是分散在不同 Partition 的。
Producer 按顺序发消息,但进⼊ Kafka Topic 之后,这些消息就不⼀定进到哪个 Partition 了,所以顺序肯定是乱的。
如果想 Topic 内的消息全局有序,就只能设置⼀个 Partition 了,这就变成了 RabbitMQ 那种结构。
但这种结构不符合 Kafka 的设计理念,Topic 只有⼀个 Partition 就失去了扩展性。
kafka 还⽀持⼀种局部有序的⽅式,就是把某⼀类的消息都放⼊同⼀个 Partition,就保证了这组消息的顺序。
在发消息的时候指定 Partition Key,Kafka 对其进⾏ Hash 计算,根据计算结果决定放⼊哪个 Partition。
所以,Partition Key ⼀样的消息肯定是在⼀起的。
例如使⽤⽤户 ID 做 key,这样同⼀个⽤户的消息肯定是在⼀起的,就保证了这⼀组的消息的有序。
Consumer 有序
MQ 内消息有序,那么 Consumer ⾃然也是按顺序接收的。
但是,如果使⽤了多个 Consumer,就可能出现乱序。
例如 RabbitMQ 的⼀个 Queue 有 3个 Consumer,虽然会按顺序接收到消息,但是它们各⾃的处理速度是不同的,所以,出来的结果很可能是乱序的。
如果想严格按顺序来,就只能使⽤⼀个 Consumer。
如果可以使⽤局部有序,那么就把之前的⼀个队列拆为多个队列,就像 Kafka 的 Partition Key ⼀样,把同组数据放⼊同⼀个队列。
Kafka 中⼀个 Partition 只能对应⼀个 Consumer,但如果 Consumer 使⽤了多线程,就和多个 Consumer ⼀个效果了,还是会造成乱序。这样的话就需要进⼀步细化消息的分组。
烤花炉
为每个线程创建⼀个内存队列,Consumer 收到消息后,把同组的消息都放在同⼀个内存队列,由同⼀个线程处理即可。氨基硅油乳液
⼩结⼀下,消息的有序需要 Producer 和 Consumer 都有序。
转子气体流量计音频编解码芯片RabbitMQ 的队列结构简单,Producer 发送的消息是有序的。但 Kafka 特殊,⼀个 Topic 有多个 Partition,如果要求全局有序,就只能使⽤⼀个 Partition。
如果可以接受局部有序,就可以为消息设置 Partition Key,其 Hash 计算结果相同的消息都会在同⼀个 Partition。
Consumer 消费时需要注意多 Consumer 的情况,例如多个消费线程。
可以在 Consumer 收到消息后再细化分组,同组的消息交给同⼀个消费线程处理。
推荐阅读

本文发布于:2024-09-21 15:23:02,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/183099.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:消息   队列   有序   消费   顺序   乱序   需要   时候
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议