分布式场景下Kafka消息顺序性的思考
如果业务中,对于kafka发送消息异步消费的场景,在业务上需要实现在消费时实现顺序消费, 利用kafka在partition内消息有序的特点,消息消费时的有序性。
1、在发送消息时,通过指定partition hash
2、consumer 消费消息时,需要使用亲缘性线程池进行消费,才能实现消息的基本有序。否则即使通过发送时指定partition,在消费端由于线程池的异步消费,消息之间的处理都是并发进行的,消息就会被打乱。
上面的方式基本可以实现消息的消费顺序性,除了在极端场景下,比如:
1、进程A 在T0时刻发送一个消息A
2、进程B在T1时刻发送了一个消息B。
由于T1>T0,并且进程A和进程B发送消息都是同一个hash partition,消息理论上在partition内消息A是在消息B前被消费的。但假如进程A和进程B出于不同的机房等原因,导致在发送消息时进程A的消息由于网络原因,要比进程B更晚发送成功,那么就会导致消息B是在消息A之前。
多集群模式下
由于kafka的有序性,只是在单集群的单partition内是有效的,所以当多集群模式下,各个集群之间的消息就不满足了有序的条件。虽然由于每个集群都是使用相同的配置,都映射同一个consumer进程消费,如下:

但是由于cluster-1-partition-5和cluster-2-partition-5两个partition之间的是不同的partition,所以没有办法做到绝对有序。
同时由于conusmer-1会出现跨机房消费的多个集群的情况,所以原本在单集群模式下,由于网络耗时而导致的消息先后顺序,在多集群情况下就会增大。目前跨集群消费延迟在2-10ms之间,所以在实际业务处理中遇到了消息A比消息B早发送,在消息B先到达的场景。
io瓶颈
由于需要在consume端实现顺序消费,需要使用亲缘性线程池以确保同一个sku在同一个线程中消费消息。这种方式当某个sku的消息量特别大时,那么就会阻塞了io线程,导致其他消息也出现大量延迟。目前默认io线程拉取消息按broker来的,应该是等同于broker数量。虽然可以增加io线程数来减缓这个情况,但依然会存在这个场景。
总结
在分布式场景下要实现消息消费强顺序性需要付出很大的成本,并且需要做到绝对顺序十分困难。如果可以容忍这个消费的无序性,那么往往就不需要用到顺序消费了。
以上分析为实际应用中遇到的坑,仅供参考,欢迎拍砖。
ps:
业务进程在发送kafka消息后,会有一个linger时间,等待linger时间之后再发送,
来源:站长资讯平台
分布式场景下Kafka消息顺序性的思考的更多相关文章
- 面试官:如何在分布式场景下生成全局唯一 ID?
在分布式系统中,有一些场景需要使用全局唯一 ID ,可以和业务场景有关,比如支付流水号,也可以和业务场景无关,比如分库分表后需要有一个全局唯一 ID,或者用作事务版本号.分布式链路追踪等等,好的全局唯 ...
- 【转】MySQL乐观锁在分布式场景下的实践
背景 在电商购物的场景下,当我们点击购物时,后端服务就会对相应的商品进行减库存操作.在单实例部署的情况,我们可以简单地使用JVM提供的锁机制对减库存操作进行加锁,防止多个用户同时点击购买后导致的库存不 ...
- MySQL乐观锁在分布式场景下的实践
背景 在电商购物的场景下,当我们点击购物时,后端服务就会对相应的商品进行减库存操作.在单实例部署的情况,我们可以简单地使用JVM提供的锁机制对减库存操作进行加锁,防止多个用户同时点击购买后导致的库存不 ...
- 难道主键除了自增就是GUID?支持k8s等分布式场景下的id生成器了解下
背景 主键(Primary Key),用于唯一标识表中的每一条数据.所以,一个合格的主键的最基本要求应该是唯一性. 那怎么保证唯一呢?相信绝大部分开发者在刚入行的时候选择的都是数据库的自增id,因为这 ...
- 【融云分析】如何实现分布式场景下唯一 ID 生成?
◀背景▶ 对于一套分布式部署的 IM 系统,要求每条消息的 ID 要保证在集群中全局唯一且按生成时间有序排列.如何快速高效的生成消息数据的唯一 ID ,是影响系统吞吐量的关键因素.那么,融云是如何做到 ...
- Kafka分布式的消息顺序
Kafka分布式的单位是partition,同一个partition用一个write ahead log组织,所以可以保证FIFO的顺序.不同partition之间不能保证顺序. 但是绝大多数用户都可 ...
- RabbitMQ保证消息的顺序性
当我们的系统中引入了MQ之后,不得不考虑的一个问题是如何保证消息的顺序性,这是一个至关重要的事情,如果顺序错乱了,就会导致数据的不一致. 比如:业务场景是这样的:我们需要根据mysql的b ...
- Pulsar の 保证消息的顺序性、幂等性和可靠性
原文链接:Pulsar の 保证消息的顺序性.幂等性和可靠性 一.背景 前面两篇文章,已经介绍了关于Pulsar消费者的详细使用和自研的Pulsar组件. 接下来,将简单分析如何保证消息的顺序性.幂等 ...
- Kafka消息系统基础知识索引
一些观念的修正 从 0.9 版本开始,Kafka 的标语已经从“一个高吞吐量,分布式的消息系统”改为"一个分布式流平台". Kafka不仅仅是一个队列,而且是一个存储,有超强的堆积 ...
随机推荐
- APIO 2010 特别行动队 斜率优化DP
Description 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号,要将他们拆分 成若干特别行动队调入战场.出于默契的考虑,同一支特别行动队中队员的编号 应该连续,即为形如 (i ...
- 经典SQL50句
50个常用的sql语句 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,T ...
- JAVA中添加jar包
右键点击工程文件,选择构建路径>添加外部归档.选择包的路径即可
- js(JavaScript)使用${pageContext.request.contextPath}报错
前几天写程序在js文件中用到了${pageContext.request.contextPath}然后一直报错,没有办法post到服务器,原来js把这个当成字符串了,一直以为他是jquery的函数! ...
- Node.js 发送Email
章节 Node.js 介绍 Node.js 入门 Node.js 模块 Node.js HTTP模块 Node.js 文件系统模块 Node.js URL模块 Node.js NPM Node.js ...
- spring教程
Spring框架是Java EE开发中最流行的框架,已经成为JEE事实上的标准,全世界的开发人员都在使用Spring框架开发各种应用.随着Spring boot,Spring cloud新版本的不断推 ...
- js如何操作或是更改sass里的变量
/*上网搜索了好多方法,最终只有这一种比较适合*/ 参考: https://blog.csdn.net/weixin_44392565/article/details/85755592 https:/ ...
- Android_03android拨号软件
今日开发了一个简单的安卓拨号软件. 步骤如下: 1.先构建用户界面 2.写java代码获取控件 3.进行逻辑的控制 4.添加权限 1.构建用户界面 2.点进R.java文件会发现系统已经自动生成索引, ...
- Web基础之Mybatis
Web基础之Mybatis 对比JdbcTempalte,mybatis才能称得上是框架,JdbcTempalte顶多算是工具类,同时,对比Hibernate,Mybatis又有更多的灵活性,算是 ...
- 高分Essay写作需注意以下几个细节
目前为止,已经有很多同学问我这个了,所以这次专门来讨论下这个问题.英语essay能达到预期分数吗,答案是肯定的,甚至会超出预期,但是必须注意到几方面,越是细节问题,越容易导致丢分,所以请重视-! 一. ...