0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

消息队列中如何保证消息的顺序性?

马哥Linux运维 来源:马哥Linux运维 2023-09-08 09:40 次阅读

我举个例子,我们以前做过一个 mysqlbinlog同步的系统,压力还是非常大的,日同步数据要达到上亿,就是说数据从一个 mysql 库原封不动地同步到另一个 mysql 库里面去(mysql -> mysql)。常见的一点在于说比如大数据 team,就需要同步一个 mysql 库过来,对公司的业务系统的数据做各种复杂的操作。

你在 mysql 里增删改一条数据,对应出来了增删改 3 条binlog日志,接着这三条binlog发送到 MQ 里面,再消费出来依次执行,起码得保证人家是按照顺序来的吧?不然本来是:增加、修改、删除;你楞是换了顺序给执行成删除、修改、增加,不全错了么。

本来这个数据同步过来,应该最后这个数据被删除了;结果你搞错了这个顺序,最后这个数据保留下来了,数据同步就出错了。

先看看顺序会错乱的俩场景:

RabbitMQ:一个 queue,多个 consumer。比如,生产者向 RabbitMQ 里发送了三条数据,顺序依次是 data1/data2/data3,压入的是 RabbitMQ 的一个内存队列。有三个消费者分别从 MQ 中消费这三条数据中的一条,结果消费者2先执行完操作,把 data2 存入数据库,然后是 data1/data3。这不明显乱了。

2cc536fa-4d90-11ee-a25d-92fbcf53809c.png

Kafka:比如说我们建了一个 topic,有三个 partition。生产者在写的时候,其实可以指定一个 key,比如说我们指定了某个订单 id 作为 key,那么这个订单相关的数据,一定会被分发到同一个 partition 中去,而且这个 partition 中的数据一定是有顺序的。

消费者从 partition 中取出来数据的时候,也一定是有顺序的。到这里,顺序还是 ok 的,没有错乱。接着,我们在消费者里可能会搞多个线程来并发处理消息。因为如果消费者是单线程消费处理,而处理比较耗时的话,比如处理一条消息耗时几十 ms,那么 1 秒钟只能处理几十条消息,这吞吐量太低了。而多个线程并发跑的话,顺序可能就乱掉了。

2cd4e082-4d90-11ee-a25d-92fbcf53809c.png

解决方案

RabbitMQ

拆分多个 queue,每个 queue 一个 consumer,就是多一些 queue 而已,确实是麻烦点;或者就一个 queue 但是对应一个 consumer,然后这个 consumer 内部用内存队列做排队,然后分发给底层不同的 worker 来处理。

2ce667d0-4d90-11ee-a25d-92fbcf53809c.png

Kafka

一个 topic,一个 partition,一个 consumer,内部单线程消费,单线程吞吐量太低,一般不会用这个。

写 N 个内存 queue,具有相同 key 的数据都到同一个内存 queue;然后对于 N 个线程,每个线程分别消费一个内存 queue 即可,这样就能保证顺序性。

2cf1d16a-4d90-11ee-a25d-92fbcf53809c.png

链接:https://www.jianshu.com/p/8a5630e2c317






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • MySQL
    +关注

    关注

    1

    文章

    795

    浏览量

    26385
  • MYSQL数据库
    +关注

    关注

    0

    文章

    95

    浏览量

    9374
  • 消息队列
    +关注

    关注

    0

    文章

    33

    浏览量

    2964
  • mysql触发器
    +关注

    关注

    0

    文章

    6

    浏览量

    1106

原文标题:面试官:消息队列中如何保证消息的顺序性?

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    FIFO队列原理简述

    FIFO是队列机制中最简单的,每个接口上只有一个FIFO队列,表面上看FIFO队列并没有提供什么QoS保证,甚至很多人认为FIFO严格意义上不算做一种
    发表于 07-10 09:22 1621次阅读

    嵌入式开发消息队列的实现

    在嵌入式开发中经常会看到消息队列的身影,队列的应用是很广泛的,它可以应用的场景有很多,比如缓存通信消息,暂存执行内容,数据顺序转发等的操作。
    发表于 08-22 11:19 1059次阅读
    嵌入式开发<b class='flag-5'>中</b>消息<b class='flag-5'>队列</b>的实现

    局部变量与队列的使用

    大家好,我有一个困扰很久的问题。我想将一个循环里的数据引用到另一个定时循环结构里,如果用局部变量的话会出现数据丢失,但实时可以保证,如果用队列的话保证了数据的完整
    发表于 05-22 14:31

    利用队列控制多设备的控制结构

    的积分,能帮忙解决的,全部奉上了...程序介绍:程序想实现功能:对一个系统的各个慢速响应设备进行控制,并且保证每个设备操作的顺序和各个设备之间的响应按照主程序分发任务的时间顺序进行由
    发表于 06-07 22:05

    数据结构之队列顺序及其构造

    数据结构之队列顺序队列构造顺序队列顺序队列的初始化判
    发表于 12-17 06:11

    LabVIEW什么是队列

    LabVIEW什么是队列队列维护数据项的先进/先出(FIFO)顺序。例如,在快餐店排队等候的顾客在排队。第一个被招待的客户将是第一个到达的客户。队列在生产者/消费者情况下很有用,其中一部分代码正在
    发表于 04-09 21:35

    LabVIEW队列使用详解

    多。3.7清空队列一次取出当前队列中所有的元素,返回一个元素数组。3.8有损耗元素入队列队列
    发表于 09-05 00:07

    iFix组态软件基于队列的命令处理机制研究

    提出了一种在iFix 组态软件创建消息队列的方法,利用这种消息队列实现了对控制命令的执行情况的跟踪与处理。这种基于队列的命令处理机制确保了组态软件的控制命令能够
    发表于 12-23 14:06 22次下载

    FIFO队列原理简述 拥塞避免原理

    拥塞管理是指网络在发生拥塞时,如何进行管理和控制。FIFO队列不对报文进行分类,按报文到达接口的先后顺序让报文进入队列,采用尽力而为的转发模式,PQ队列是针对关键业务应用设计的。
    发表于 02-23 08:35 1w次阅读
    FIFO<b class='flag-5'>队列</b>原理简述 拥塞避免原理

    单片机实现FIFO循环队列的代码和资料免费下载

    顺序栈相类似,在队列顺序存储结构,除了用一组地址连续的存储单元依次存放从队列头到队列尾的元
    发表于 09-19 17:19 2次下载
    单片机实现FIFO循环<b class='flag-5'>队列</b>的代码和资料免费下载

    SystemVerilog队列

    队列是大小可变的有序集合,队列中元素必须是同一个类型的。队列支持对其所有元素的访问以及在队列的开始或结束处插入和删除。
    的头像 发表于 10-31 10:09 3862次阅读

    什么是消息队列?消息队列中间件重要吗?

    应用解耦:消息队列减少了服务之间的耦合,不同的服务可以通过消息队列进行通信,而不用关心彼此的实现细节。
    的头像 发表于 11-07 14:55 1355次阅读

    ZWave的消息队列机制是什么

    这篇文章就来看看 ZWave 是通过什么机制为我们提供了一个便捷的消息队列处理机制。
    的头像 发表于 02-14 13:41 729次阅读
    ZWave<b class='flag-5'>中</b>的消息<b class='flag-5'>队列</b>机制是什么

    RTOS消息队列的应用

    基于RTOS的应用,通常使用队列机制实现任务间的数据交互,一个应用程序可以有任意数量的消息队列,每个消息队列都有自己的用途。
    发表于 05-29 10:49 600次阅读
    RTOS消息<b class='flag-5'>队列</b>的应用

    FreeRTOS消息队列介绍

    队列是为了任务与任务、任务与中断之间的通信而准备的,可以在任务与任务、任务与中断之间传递消息,队列可以存储有限的、大小固定的数据项目。任务与任务、任务与中断之间要交流的数据保存在队列
    的头像 发表于 07-06 16:58 761次阅读
    FreeRTOS消息<b class='flag-5'>队列</b>介绍