消息队列面试 - 如何保证消息的顺序性?

面试题

如何保证消息的顺序性?

面试官心理分析

其实这个也是用 MQ 的时候必问的话题,第一看看你了不了解顺序这个事儿?第二看看你有没有办法保证消息是有顺序的?这是生产系统中常见的问题。

面试题剖析

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

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

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

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

  • RabbitMQ:一个 queue,多个 consumer。比如,生产者向 RabbitMQ 里发送了三条数据,顺序依次是 data1/data2/data3,压入的是 RabbitMQ 的一个内存队列。有三个消费者分别从 MQ 中消费这三条数据中的一条,结果消费者2先执行完操作,把 data2 存入数据库,然后是 data1/data3。这不明显乱了。
  • Kafka:比如说我们建了一个 topic,有三个 partition。生产者在写的时候,其实可以指定一个 key,比如说我们指定了某个订单 id 作为 key,那么这个订单相关的数据,一定会被分发到同一个 partition 中去,而且这个 partition 中的数据一定是有顺序的。
    消费者从 partition 中取出来数据的时候,也一定是有顺序的。到这里,顺序还是 ok 的,没有错乱。接着,我们在消费者里可能会搞多个线程来并发处理消息。因为如果消费者是单线程消费处理,而处理比较耗时的话,比如处理一条消息耗时几十 ms,那么 1 秒钟只能处理几十条消息,这吞吐量太低了。而多个线程并发跑的话,顺序可能就乱掉了。

解决方案

RabbitMQ

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

Kafka

  • 一个 topic,一个 partition,一个 consumer,内部单线程消费,单线程吞吐量太低,一般不会用这个。
  • 写 N 个内存 queue,具有相同 key 的数据都到同一个内存 queue;然后对于 N 个线程,每个线程分别消费一个内存 queue 即可,这样就能保证顺序性。

转载来源:https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/how-to-ensure-the-order-of-messages.md

消息队列面试 - 如何保证消息的顺序性?相关推荐

  1. 消息队列面试 - 如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?

    消息队列面试 - 如何保证消息不被重复消费? 面试题 如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性? 面试官心理分析 其实这是很常见的一个问题,这俩问题基本可以连起来问.既然是消费消息, ...

  2. 消息队列面试 - 如何保证消息的可靠性传输?

    消息队列面试 - 如何保证消息的可靠性传输? 面试题 如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题? 面试官心理分析 这个是肯定的,用 MQ 有个基本原则,就是数据不能多一条,也不能少一条 ...

  3. 消息队列面试 - 如何保证消息队列的高可用?

    面试题 如何保证消息队列的高可用? 面试官心理分析 如果有人问到你 MQ 的知识,高可用是必问的.上一讲提到,MQ 会导致系统可用性降低.所以只要你用了 MQ,接下来问的一些要点肯定就是围绕着 MQ ...

  4. 消息队列面试 - 如何进行消息队列架构设计?

    消息队列面试 - 如何进行消息队列架构设计? 面试题 如果让你写一个消息队列,该如何进行架构设计?说一下你的思路. 面试官心理分析 其实聊到这个问题,一般面试官要考察两块: 你有没有对某一个消息队列做 ...

  5. 消息队列面试 - 为什么使用消息队列,消息队列有什么优点和缺点?

    消息队列面试 - 为什么使用消息队列,消息队列有什么优点和缺点? 面试题 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka.ActiveMQ.RabbitMQ.RocketMQ 都有什么区 ...

  6. 消息队列面试 - 如何解决消息队列的延时以及过期失效问题?

    消息队列面试 - 如何解决消息队列的延时以及过期失效问题? 面试题 如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决? 面试官心理分析 你看 ...

  7. 高薪程序员面试题精讲系列127之如何设计一个消息队列?如何保证消息的执行顺序?

    一. 面试题及剖析 1. 今日面试题 如何保证消息队列中消息的执行顺序? RabbitMQ消息过期了怎么办? 如何设计一个消息队列? 如果让你自己设计一个消息队列,该怎么实现? 2. 题目剖析 壹哥在 ...

  8. 消息队列MQ如何保证消息的幂等性

    Table of Contents 一.出现非幂等性的情况 二.解决办法 1.mq接收生产者传来的消息: 2.消费者消费mq中的消息: 三.重复消费可能会在什么场景下出现(以kafka为例) 怎么保证 ...

  9. rabbitmq接收不到消息_分布式消息队列:如何保证消息的可靠性传输

    rabbitmq (1)生产者弄丢了数据 生产者将数据发送到rabbitmq的时候,可能数据就在半路给搞丢了,因为网络啥的问题,都有可能. 此时可以选择用rabbitmq提供的事务功能,就是生产者发送 ...

最新文章

  1. css块级元素与行级元素
  2. 转:浅谈Linux的内存管理机制
  3. 调用其他脚本上方法的方法
  4. 《你的灯亮着吗》读书笔记3
  5. JavaScript设计模式系列四之外观模式(附案例源码)
  6. IntelliJ IDEA+Mysql connecter/j JDBC驱动连接
  7. 数据结构----单源最短路径Dijkstra
  8. 普罗米修斯 监控_新一代的监控系统普罗米修斯(Prometheus)
  9. HDOJ 1671 HDU 1671 Phone List ACM 1671 IN HDU
  10. 对网站商城源码的研究分析 分享大量源码下载
  11. 菜鸟教程html码字有颜色,零基础也能看懂!写给设计师的前端小知识之网页排版(附实战)...
  12. 用js来实现添加学生信息表
  13. 【WordCloud】将周董的歌用词云可视化
  14. php手册 mac版,php中文手册for mac-php中文手册mac版下载v1.0.2 官方最新版__西西软件下载...
  15. 霍尔编码器-STM32读取
  16. 利用pdf.js封装vue组件在vue中实现在线pdf查看
  17. 运营周期爆发期是什么?
  18. java short 写法_Java数据类型short的使用方法
  19. HTML鼠标滚轮事件
  20. 为什么编程是独一无二的职业

热门文章

  1. 自适应网页设计(Responsive Web Design)响应式设计
  2. JavaScript 压缩 加密 解密
  3. 集成方法(随机森林)
  4. Docker部署Angular应用
  5. 利用juypter搭建远程可访问的python交互页面
  6. Java—List集合详解
  7. Kubernetes-存活探针(liveness probe)(十六)
  8. 动态规划经典题:给出两个字符串s1和s2,返回其中最大的公共子串
  9. 编码规范一 结构与要求
  10. django-演练-搜索引擎