mq如何保证消息顺序性

这篇具有很好参考价值的文章主要介绍了mq如何保证消息顺序性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

面试的时候,经常会有面试官问道这个问题,发送顺序消息。

讨论

顺序性其实有两方面,一方面要保证Producer发送时是有序的,Consumer接受和处理消息的有序性。
另一面来说,我们也要考虑是需要全局有序还是局部有序就可以。

kafka

kafka的topic是分Partition的,当有多个Partition的时候,消息可能会按照/或者不按照规则被发送到不同的Partition。
Kafka 中的消费是基于拉模式的,即消费者主动向服务端发起请求来拉取消息。 Kakfa 中的消息消费是一个不断轮询的过程,消费者所要做的就是重复地调用 poll () 方法,而 poll () 方法返回的是所订阅主题(或分区)上的一组消息。

全局有序

所以如果想做到全局有序的话,我们可以只设置一个Partition,这样保证发送的有序性,同时,Consumer端也应该保证接收有序并且不要用多线程,单线程处理。

局部有序

刚才说到了一个topic可以有多个Partition,kafka确保每个Partition只能同一个group中的同一个Consumer消费,所以就Consumer来说,可以保证一个Partition的消息顺序消费,然后kafka的Producer端可以根据要发送消息内容,指定Partition Key,Kafka对其进行Hash计算,根据计算结果决定放入哪个Partition。这样Partition Key相同的消息会放在同一个Partition。此时,Partition的数量仍然可以设置多个,提升Topic的整体吞吐量。

消息重试对顺序消息的影响

对于一个有着先后顺序的消息A、B,正常情况下应该是A先发送完成后再发送B,但是在异常情况下,在A发送失败的情况下,B发送成功,而A由于重试机制在B发送完成之后重试发送成功了。这时对于本身顺序为AB的消息顺序变成了BA。

针对这种问题,严格的顺序消费还需要max.in.flight.requests.per.connection参数的支持。

该参数指定了生产者在收到服务器响应之前可以发送多少个消息。它的值越高,就会占用越多的内存,同时也会提升吞吐量。把它设为1就可以保证消息是按照发送的顺序写入服务器的。

此外,对于某些业务场景,设置max.in.flight.requests.per.connection=1会严重降低吞吐量,如果放弃使用这种同步重试机制,则可以考虑在消费端增加失败标记的记录,然后用定时任务轮询去重试这些失败的消息并做好监控报警。

rocketmq

rocketmq的消息模式其实和kafka大差不差,rocketmq的Topic分Queue,当有多个Queue的时候,消息可能会按照/或者不按照规则被发送到不同的Queue。一个Queue最多只能分配给一个Consumer,一个Cosumer可以分配得到多个Queue。
Kafka 中的消费是基于拉模式的,即消费者主动向服务端发起请求来拉取消息。 Kakfa 中的消息消费是一个不断轮询的过程,消费者所要做的就是重复地调用 poll () 方法,而 poll () 方法返回的是所订阅主题(或分区)上的一组消息。

全局有序

同上,一个Topic只设置一个Queue,Producer保证发送有序。Consumer保证接收有序并且不要用多线程,单线程处理。或者使用可以保证处理顺序的线程模型。

局部有序

rockemt的Consumer消费消息有两种形式:Push和Pull,大多数场景使用的是Push模式,在源码中这两种模式分别对应的是DefaultMQPushConsumer类和DefaultMQPullConsumer类。Push模式实际上在内部还是使用的Pull方式实现的,通过Pull不断地轮询Broker获取消息,当不存在新消息时,Broker端会挂起Pull请求,直到有新消息产生才取消挂起,返回新消息。

那我们就可以通过Producer发送有序消息,通过MessageQueueSelector()来指定消息发送到哪个队列,保证局部有序,消费方启动顺序消费,通过new MessageListenerOrderly()来控制。

消息重试对顺序消息的影响

对于Rocketmq来说,一个Consumer只能注册一个Listener,所以一个consumer要么按顺序消息的方式来消费,要么按普通消息的方式来消费。所以,如果一个用户进程要收两种消息,最好使用两个Consumer实例。
从实例代码可以看出,顺序消息处理消息后返回状态跟普通消息也有所不同,失败的话是返回的SUSPEND_CURRENT_QUEUE_A_MOMENT,而不是RECONSUME_LATER。这是因为对于顺序消息,消费失败是不会返回给broker重新投递的(其实即使重发也还是发到这个consumer上,没必要多此一举),而是会放到本地的缓存队列中重新处理。另外两个状态ROLLBACKCOMMIT已经被设置成deprecated了,我们就不关心了。

参考

一文理解Kafka如何保证消息顺序性
RocketMQ源码解析(十二)-顺序消息文章来源地址https://www.toymoban.com/news/detail-487652.html

到了这里,关于mq如何保证消息顺序性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何保证Mq消息不丢失

    mq: rabbitmq, rocketmq, kafka 1.RocketMQ RocketMQ是如何最大限度的保证消息不丢失 生产阶段:消息在 Producer 发送端创建出来,经过网络传输发送到 Broker 存储端。 存储阶段:消息在 Broker 端存储,如果是主备或者多副本,消息会在这个阶段被复制到其他的节点或者副本上。 消费阶段:

    2023年04月09日
    浏览(33)
  • 如何保证MQ消息有序性?

    消息的有序性指的是一个生产者生产的消息消费顺序和生产顺序一致,例如使用binlog+mq进行数据同步的时候,对于单条记录的增加、和修改和删除应该保持有序,消费消息时如果消息变成删除、修改和删除,则导致同步数据不一致。对于最简单的消息模型,一个生产者+一个消

    2024年02月05日
    浏览(23)
  • Kafka 如何保证消息的消费顺序

    我们在使用消息队列的过程中经常有业务场景需要严格保证消息的消费顺序,比如我们同时发了 2 个消息,这 2 个消息对应的操作分别对应的数据库操作是: 更改用户会员等级。 根据会员等级计算订单价格。 假如这两条消息的消费顺序不一样造成的最终结果就会截然不同。

    2024年02月13日
    浏览(38)
  • 如何保证RabbitMQ消息的顺序性

    针对以上问题,一个解决思路是:保证消息的唯一性,就算是多次传输,不要让消息的多次消费带来影响;保证消息等幂性;比如:在写入消息队列的数据做唯一标示,消费消 息时,根据唯一标识判断是否消费过;假设你有个系统,消费一条消息就往数据库里插入一条数据,

    2024年02月07日
    浏览(26)
  • kafka 如何保证消息的顺序消费

    在Kafka分布式集群中,要保证消息的顺序消费,您可以采取以下措施: 分区策略 :Kafka的主题可以分为多个分区,每个分区内的消息是有序的。因此,首先要确保生产者将相关的消息发送到同一个分区。这可以通过生产者的分区策略来实现。默认情况下,Kafka会使用基于消息

    2024年02月06日
    浏览(31)
  • Kafka 如何保证消息消费的全局顺序性

    哈喽大家好,我是咸鱼 今天我们继续来讲一讲 Kafka 当有消息被生产出来的时候,如果没有指定分区或者指定 key ,那么消费会按照【轮询】的方式均匀地分配到所有可用分区中,但不一定按照分区顺序来分配 我们知道,在 Kafka 中消费者可以订阅一个或多个主题,并被分配一

    2024年02月05日
    浏览(35)
  • Kafka、RocketMQ、RabbitMQ如何保证消息的顺序消费?

    一、1个Topic(主题)只创建1个Partition (分区),这样生产者的所有数据都发送到了一个Partition (分区),保证了消息的消费顺序; 二、生产者在发送消息的时候指定要发送到哪个 Partition,这样同一个 Partition 的数据会被同一个消费者消费,从而保证了消息的消费顺序。 实现思路

    2024年02月09日
    浏览(34)
  • kafka 分布式的情况下,如何保证消息的顺序消费?

    目录 一、什么是分布式 二、kafka介绍 三、消息的顺序消费 四、如何保证消息的顺序消费   分布式是指将计算任务分散到多个计算节点上进行并行处理的一种计算模型。在分布式系统中,多台计算机通过网络互联,共同协作完成任务。每个计算节点都可以独立运行,并且可以

    2024年02月10日
    浏览(41)
  • Kafka面试】Kafka如何保证消费的顺序性?

    消费者组的某个消费者可能负责消费 一个topic的多个分区 。每个分区都维护了偏移量(都是从0开始的),在消息存储时按照一定的策略来找到不同的分区进行存储,消费同样如此,并不能保证消息的顺序性。 要想保证顺序性,可以只提供一个分区,或者相同的业务只在一个

    2024年02月15日
    浏览(30)
  • 阿里二面:Kafka中如何保证消息的顺序性?这周被问到两次了

    在现代分布式系统中,消息顺序消费扮演着至关重要的角色。特别是在涉及事务处理、日志追踪、状态机更新等场景时,消息的处理顺序直接影响着系统的正确性和一致性。例如,金融交易系统中,账户间的转账操作必须严格按照发出请求的顺序进行处理,否则可能导致资金

    2024年03月20日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包