如何保证MQ消息有序性?

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


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

如何保证MQ消息有序性?
消息从生产到消费有两个传输阶段,第一个阶段是从生产者到消息队列,第二个节点是从消息队列推送到消费端,为了使用保证消息MQ中消息有序,需要在两阶段进行控制。

生产端控制消息有序

对于RabbitMQ一个topic对应一个channel,从生产者到消费者不会出现顺序问题。
如何保证MQ消息有序性?
对于kafaka,一个topic的消息进行分片,存储在不同的队列里面,这样就无法利用队列的FIFO特性,保证消费消息时的有序性。

如何保证MQ消息有序性?
如果要保证一个topic中的所有消息有序,只能讲将kafaka的partition设置为1;

如何保证MQ消息有序性?

同时kafaka还支持局部有序,在生产消息时为每条消息指定partition key,分区key相同 消息会落入同一个分区中。对于每个消息,可以根据消息的整体内容,或者消息中某个字段,计算消息要落入的分片key,例如在使用binlog+mq同步mysql数据时,对每条记录的主键id号进行hash计算,确定要落入的分片。

如何保证MQ消息有序性?

消费端控制消息有序

对于rabbitMQ,一个队列对应一个消费者,消息消费是有序的,不会出现什么问题,当出现多个消费者时,依然会出现同一类消息消费顺序打乱的情况。

如何保证MQ消息有序性?

方法1:是只使用一个消费者,但这样会影响消费的速度,尤其是当下游消费速度很慢的情况,极有可能造成消息的积压,真正项目中也很少使用。

方法2:对一个topic的中消息使用多个队列来存储,并且将同一个类消息放在同一个队列中,一个队列中消息依然对应一个消费者,由于每个topic消息分散存储在多个队列中,每个队列中消息数量不会太多,引起消息积压的概率较小。缺点,每个topic都需要创建多个队列,需要维护大量的队列。
如何保证MQ消息有序性?

对于kafka,一个pation对应一个consumer,但是当comsumer使用了多线程技术,等价于一个队列对应多个consumer。

如何保证MQ消息有序性?
解决办法:

在消费者消费消息的时候,对消息进行分类,同一类的的消息使用同一个内存队列进行存储。缺点:使用大量内存队列存储消息会占用太多内存,影响应用整体性能。

如何保证MQ消息有序性?

总结

RabbitMQ消息模型简单,生产消息端是有序的。kafka一个topic中的消息对应多个patition,要保证一个topic中消息的有序,就只能设置一个patition。

在大多数业务场景中只需要保证局部有序,通过对每条消息计算partitionkey,让同一类消息落在同一个patition中。

在多consumer情况下,例如多线程情况,对消息可以进一步细化,保证同一类消息被同一个消费线程消费。

note:以上谈论mq有序性,都是针对生产者、消息队列和和消费者都是单机情况,集群情况下还需要考虑消息的分发和路由。

Reference

[1] https://segmentfault.com/a/1190000040004347
[2] https://xie.infoq.cn/article/c84491a814f99c7b9965732b1
[3] https://learn.lianglianglee.com/%E4%B8%93%E6%A0%8F/%E5%88%86%E5%B8%83%E5%BC%8F%E6%8A%80%E6%9C%AF%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E6%88%9845%E8%AE%B2-%E5%AE%8C/32%20%E4%B8%9A%E5%8A%A1%E4%B8%8A%E9%9C%80%E8%A6%81%E9%A1%BA%E5%BA%8F%E6%B6%88%E8%B4%B9%EF%BC%8C%E6%80%8E%E4%B9%88%E4%BF%9D%E8%AF%81%E6%97%B6%E5%BA%8F%E6%80%A7%EF%BC%9F.md文章来源地址https://www.toymoban.com/news/detail-445851.html

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

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

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

相关文章

  • JUC之可见性和有序性

    目录 java内存模型 可见性 现象出现  现象解释  解决方法 有序性 诡异的结果 解决方法 Happens-before规则 Java内存模型(Java Memory Model,简称JMM)定义了Java程序中各种变量、对象的访问方式和内存关系。 JMM规定了线程之间的可见性、原子性、顺序性等问题, 确保多线程并发访

    2024年02月09日
    浏览(26)
  • 如何保证Mq消息不丢失

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

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

    面试的时候,经常会有面试官问道这个问题,发送顺序消息。 顺序性其实有两方面,一方面要保证Producer发送时是有序的,Consumer接受和处理消息的有序性。 另一面来说,我们也要考虑是需要全局有序还是局部有序就可以。 kafka的topic是分Partition的,当有多个Partition的时候,

    2024年02月09日
    浏览(26)
  • MQ系列12:如何保证消息顺序性

    MQ系列1:消息中间件执行原理 MQ系列2:消息中间件的技术选型 MQ系列3:RocketMQ 架构分析 MQ系列4:NameServer 原理解析 MQ系列5:RocketMQ消息的发送模式 MQ系列6:消息的消费 MQ系列7:消息通信,追求极致性能 MQ系列8:数据存储,消息队列的高可用保障 MQ系列9:高可用架构分析

    2024年02月08日
    浏览(49)
  • [kafka]kafka如何保证消息有序

    严格的说,kafka只能保证同一个分区内的消息存储的有序性。 这个问题并没有标准答案,面试官只是想看看你如何思考的。 kafka只能保证单partition有序,如果kafka要保证多个partition有序,不仅broker保存的数据要保持顺序,消费时也要按序消费。假设partition1堵了,为了有序,那

    2024年02月16日
    浏览(27)
  • Kafka如何保证消息的消费顺序【全局有序、局部有序】、Kafka如何保证消息不被重复消费、Kafka为什么这么快?【重点】、Kafka常见问题汇总【史上最全】

    目录 Kafka消息生产 一个Topic对应一个Partition 一个Topic对应多个Partition Kafka消息的顺序性保证(Producer、Consumer) 全局有序 局部有序  max.in.flight.requests.per.connection参数详解 Kafka的多副本机制 Kafka的follower从leader同步数据的流程 Kafka的follower为什么不能用于消息消费 Kafka的多分区

    2024年04月11日
    浏览(36)
  • mq常见问题:消息丢失、消息重复消费、消息保证顺序

    mq常见问题:消息丢失、消息重复消费、消息保证顺序 消息丢失问题 拿rabbitmq举例来说,出现消息丢失的场景如下图 从图中可以看到一共有以下三种可能出现消息丢失的情况: 1 生产者丢消息 生产者在将数据发送到MQ的时候,可能由于网络等原因造成消息投递失败 2MQ自身丢

    2024年02月09日
    浏览(44)
  • 消息中间件之八股面试回答篇:一、问题概览+MQ的应用场景+RabbitMQ如何保证消息不丢失(生产者确认机制、持久化、消费者确认机制)+回答模板

    目前主流的消息队列技术(MQ技术)分为RabbitMQ和Kafka,其中深蓝色为只要是MQ,一般都会问到的问题。浅蓝色是针对RabbitMQ的特性的问题。蓝紫色为针对Kafka的特性的问题。 MQ主要提供的功能为:异步 解耦 削峰 。 展开来讲就是 异步发送(验证码、短信、邮件…) MYSQL和Redi

    2024年01月24日
    浏览(44)
  • kafka是有序的吗?如何保证有序?

    首先,Kafka无法保证消息的全局有序性,这是因为Kafka的设计中允许多个生产者并行地向同一个主题写入消息。而且,一个主题可能会被划分为多个分区,每个分区都可以在独立的生产者和消费者之间进行并行处理。因此,生产者将消息写入各自的分区,而这些分区可能会在不

    2024年02月13日
    浏览(22)
  • 什么是mq?可靠性、重复消息、重复消费、丢失、发送大文件、延迟、发送机制、重试、死信、幂等、有序、大小、过期、优先级、进了死信队列还能出来吗?

    “MQ” 指的是消息队列(Message Queue),是一种用于异步通信的技术。消息队列是一种中间件,用于在分布式系统中传递消息,使不同组件之间能够进行松散耦合的通信。它的核心思想是生产者将消息发送到队列,而消费者从队列中接收并处理消息。 消息队列的主要优点包括

    2024年02月06日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包