| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 如何保证MQ消息有序性? -> 正文阅读 |
|
[大数据]如何保证MQ消息有序性? |
消息的有序性指的是一个生产者生产的消息消费顺序和生产顺序一致,例如使用binlog+mq进行数据同步的时候,对于单条记录的增加、和修改和删除应该保持有序,消费消息时如果消息变成删除、修改和删除,则导致同步数据不一致。对于最简单的消息模型,一个生产者+一个消息队列+一个消费者,由于队列具有先进先出(FIFO,first in first out)特性,这样的消息模型消息时有序的。
生产端控制消息有序对于RabbitMQ一个topic对应一个channel,从生产者到消费者不会出现顺序问题。
同时kafaka还支持局部有序,在生产消息时为每条消息指定partition key,分区key相同 消息会落入同一个分区中。对于每个消息,可以根据消息的整体内容,或者消息中某个字段,计算消息要落入的分片key,例如在使用binlog+mq同步mysql数据时,对每条记录的主键id号进行hash计算,确定要落入的分片。 消费端控制消息有序对于rabbitMQ,一个队列对应一个消费者,消息消费是有序的,不会出现什么问题,当出现多个消费者时,依然会出现同一类消息消费顺序打乱的情况。 方法1:是只使用一个消费者,但这样会影响消费的速度,尤其是当下游消费速度很慢的情况,极有可能造成消息的积压,真正项目中也很少使用。 方法2:对一个topic的中消息使用多个队列来存储,并且将同一个类消息放在同一个队列中,一个队列中消息依然对应一个消费者,由于每个topic消息分散存储在多个队列中,每个队列中消息数量不会太多,引起消息积压的概率较小。缺点,每个topic都需要创建多个队列,需要维护大量的队列。 对于kafka,一个pation对应一个consumer,但是当comsumer使用了多线程技术,等价于一个队列对应多个consumer。
在消费者消费消息的时候,对消息进行分类,同一类的的消息使用同一个内存队列进行存储。缺点:使用大量内存队列存储消息会占用太多内存,影响应用整体性能。 总结RabbitMQ消息模型简单,生产消息端是有序的。kafka一个topic中的消息对应多个patition,要保证一个topic中消息的有序,就只能设置一个patition。 在大多数业务场景中只需要保证局部有序,通过对每条消息计算partitionkey,让同一类消息落在同一个patition中。 在多consumer情况下,例如多线程情况,对消息可以进一步细化,保证同一类消息被同一个消费线程消费。 note:以上谈论mq有序性,都是针对生产者、消息队列和和消费者都是单机情况,集群情况下还需要考虑消息的分发和路由。 Reference[1] https://segmentfault.com/a/1190000040004347 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 6:50:32- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |