kafka分布式的情况下,如何保证消息的顺序?
2024-08-30 10:47:08
作者:可期
链接:https://www.zhihu.com/question/266390197/answer/772404605
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
链接:https://www.zhihu.com/question/266390197/answer/772404605
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
关于Kafka保证单partition有序的讨论如下:
一、为什么只保证单partition有序
如果Kafka要保证多个partition有序,不仅broker保存的数据要保持顺序,消费时也要按序消费。假设partition1堵了,为了有序,那partition2以及后续的分区也不能被消费,这种情况下,Kafka 就退化成了单一队列,毫无并发性可言,极大降低系统性能。因此Kafka使用多partition的概念,并且只保证单partition有序。这样不同partiiton之间不会干扰对方。
二、Kafka如何保证单partition有序?
- producer发消息到队列时,通过加锁保证有序
现在假设两个问题
broker leader在给producer发送ack时,因网络原因超时,那么Producer 将重试,造成消息重复。
先后两条消息发送。t1时刻msg1发送失败,msg2发送成功,t2时刻msg1重试后发送成功。造成乱序。
2.解决重试机制引起的消息乱序
为实现Producer的幂等性,Kafka引入了Producer ID(即PID)和Sequence Number。对于每个PID,该Producer发送消息的每个<Topic, Partition>都对应一个单调递增的Sequence Number。同样,Broker端也会为每个<PID, Topic, Partition>维护一个序号,并且每Commit一条消息时将其对应序号递增。对于接收的每条消息,如果其序号比Broker维护的序号)大一,则Broker会接受它,否则将其丢弃:
- 如果消息序号比Broker维护的序号差值比一大,说明中间有数据尚未写入,即乱序,此时Broker拒绝该消息,Producer抛出InvalidSequenceNumber
- 如果消息序号小于等于Broker维护的序号,说明该消息已被保存,即为重复消息,Broker直接丢弃该消息,Producer抛出DuplicateSequenceNumber
- Sender发送失败后会重试,这样可以保证每个消息都被发送到broker
最新文章
- Spring Security (一)
- C++ CTime COleTime的一些操作技巧
- Binary Tree Maximum Path Sum
- android报表图形引擎(AChartEngine)demo解析与源码
- 事关Animation Tree的工作随笔(一)
- ZJUTACM(hd1259)
- CodeForces 228D. Zigzag(线段树暴力)
- 浅析ThreadLocal
- Spring异常处理@ExceptionHandler
- Hive命令及操作
- 使用Eclipse+jlink调试STM32
- C# 会话,进程,线程,线程安全
- vs2010提取资源
- SpringBoot系列之Hikari连接池
- FastReport 保存为文件
- mysql数据库优化(二)
- PAT甲级 1127. ZigZagging on a Tree (30)
- 人民币-欧元预测(ARIMA算法)代码
- hadoop 基础视频1
- libuv在mingw下编译
热门文章
- 四探循环依赖 → 当循环依赖遇上 BeanPostProcessor,爱情可能就产生了!
- 实战 | 关于随手一点就发现XSS漏洞这件事
- RFC2889广播时延测试——网络测试仪实操
- Smartbi研究院分享:数据仓库的五大特点
- 思迈特软件Smartbi的特色功能有哪些?
- 运维人员常用的Linux命令总结
- 安装Android studio 并成功运行
- Python:collections.Counter
- 报错:net::err_unknown_url_scheme的解决办法
- JZ-047-求 1+2+3+...+n