1.为什么要保证顺序

消息队列中的若干消息如果是对同一个数据进行操作,这些操作具有前后的关系,必须要按前后的顺序执行,否则就会造成数据异常。举例:
比如通过mysql binlog进行两个数据库的数据同步,由于对数据库的数据操作是具有顺序性的,如果操作顺序搞反,就会造成不可估量的错误。比如数据库对一条数据依次进行了 插入->更新->删除操作,这个顺序必须是这样,如果在同步过程中,消息的顺序变成了 删除->插入->更新,那么原本应该被删除的数据,就没有被删除,造成数据的不一致问题。

2.出现顺序错乱的场景

(1)rabbitmq
①一个queue,有多个consumer去消费,这样就会造成顺序的错误,consumer从MQ里面读取数据是有序的,但是每个consumer的执行时间是不固定的,无法保证先读到消息的consumer一定先完成操作,这样就会出现消息并没有按照顺序执行,造成数据顺序错误。

②一个queue对应一个consumer,但是consumer里面进行了多线程消费,这样也会造成消息消费顺序错误。

(2)kafka
①kafka一个topic,一个partition,一个consumer,但是consumer内部进行多线程消费,这样数据也会出现顺序错乱问题。

②具有顺序的数据写入到了不同的partition里面,不同的消费者去消费,但是每个consumer的执行时间是不固定的,无法保证先读到消息的consumer一定先完成操作,这样就会出现消息并没有按照顺序执行,造成数据顺序错误。

3.保证消息的消费顺序

(1)rabbitmq
①拆分多个queue,每个queue一个consumer,就是多一些queue而已,确实是麻烦点;这样也会造成吞吐量下降,可以在消费者内部采用多线程的方式取消费。

②或者就一个queue但是对应一个consumer,然后这个consumer内部用内存队列做排队,然后分发给底层不同的worker来处理

(2)kafka
①确保同一个消息发送到同一个partition,一个topic,一个partition,一个consumer,内部单线程消费。

②写N个内存queue,然后N个线程分别消费一个内存queue即可

上一篇《如何防止数据队列数据丢失

下一篇《消息积压在消息队列里怎么办

最新文章

  1. 强大的grep命令
  2. Java实现MySQL在线管理
  3. 颜色矩阵 滤镜 ColorMatrix
  4. android 实现蓝牙自动配对连接
  5. Frequent Distribution sorted by frequency
  6. 1064 Financial Management
  7. Bom 字符串的问题
  8. IDEA设置注释的颜色
  9. Ubuntu 之 atom 安装以及 常用配置
  10. Codeforces 375C Circling Round Treasures - 最短路 - 射线法 - 位运算
  11. centos6和centos7的防火墙的操作
  12. day16作业
  13. SpringMVC框架03——数据绑定
  14. tf.nn的conv2d卷积与max_pool池化
  15. WPF 本地化(多语言)
  16. Linux 入门记录:十六、Linux 多命令协作:管道及重定向
  17. 比 file_get_contents() 更优的 cURL 详解(附实例)
  18. Linux 下Tomcat的启动、关闭、杀死进程
  19. vim tabs
  20. CoreAnimation 核心动画 / CABasicAnimation/ CAKeyframeAnimation

热门文章

  1. Python带参数的函数装饰器
  2. window.location.href重定向失败的问题
  3. 【Tomcat】Tomcat 配置JNDI数据源(三)
  4. VMware虚拟机提示“锁定文件失败 打不开磁盘”解决方法
  5. Qt编写气体安全管理系统15-网络转发
  6. linux生成新的列(awk)
  7. Linux的桌面虚拟化技术KVM(三)——KVM虚拟机克隆和快照
  8. elasticsearch5.0.1集群索引分片丢失的处理
  9. LODOP设置打印份数及是否逐份输出
  10. 修改ecshop的70种技巧