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

    文章

    775

    浏览量

    26005
  • MYSQL数据库
    +关注

    关注

    0

    文章

    95

    浏览量

    9277
  • 消息队列
    +关注

    关注

    0

    文章

    31

    浏览量

    2921
  • mysql触发器
    +关注

    关注

    0

    文章

    6

    浏览量

    1077

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

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

收藏 人收藏

    评论

    相关推荐

    FIFO队列原理简述

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

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

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

    labview中队列嵌套使用的问题?

    利用队列里的采集数据处理显示数据,由于越到后面保存数据时的处理时间越长,为保证没有延迟或没有漏掉数据处理显示数据,把部分处理后的数据写入到第二个队列,在第二个
    发表于 03-30 11:31

    局部变量与队列的使用

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

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

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

    uCOS II 消息队列的使用方法

    [0],SIZE); 5、 等待消息队列的消息,OSQPend();void *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *err):必须保证
    发表于 09-13 21:37

    UART接收到数据处理怎么保证数据顺序正确

    本帖最后由 72528 于 2019-3-14 13:10 编辑 对于UART接收到的数据放在一个数组里,在处理这个数据 时候,怎么保证数据顺序正确。比如发送77 FF EC ,怎么保证BUFFER[0]=77,BUFFE
    发表于 03-14 11:22

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

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

    LabVIEW什么是队列

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

    顺序一致和TSO一致分别是什么?SC和TSO到底哪个好?

    保证某个内核的fence指令前的所有memory访问能够在fence指令后的memory访问之前完成。实际上fence指令(或者说是memory barrier)在后续我们即将介绍的弱序内存一致
    发表于 07-19 14:54

    LabVIEW队列使用详解

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

    rt_wqueue_wakeup能不能一次唤醒等待队列的所有线程?

    最近在看等待队列,发现void rt_wqueue_wakeup(rt_wqueue_t *queue, void *key)每执行一次只能唤醒等待队列的一个线程?能不能一次唤醒等
    发表于 11-07 14:24

    STM32L496如何从队列读取数据而不从队列删除?

    您好,我有 STM32L496 并使用 Freertos 10.2。一切都很好,但我想从队列读取数据而不从队列删除。我发现了函数xQueuePeek()但如果我可以从
    发表于 12-26 09:39

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

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

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

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