作者:可期
链接:https://www.zhihu.com/question/266390197/answer/772404605
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

关于Kafka保证单partition有序的讨论如下:

一、为什么只保证单partition有序

如果Kafka要保证多个partition有序,不仅broker保存的数据要保持顺序,消费时也要按序消费。假设partition1堵了,为了有序,那partition2以及后续的分区也不能被消费,这种情况下,Kafka 就退化成了单一队列,毫无并发性可言,极大降低系统性能。因此Kafka使用多partition的概念,并且只保证单partition有序。这样不同partiiton之间不会干扰对方。

二、Kafka如何保证单partition有序?

  1. 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

最新文章

  1. Spring Security (一)
  2. C++ CTime COleTime的一些操作技巧
  3. Binary Tree Maximum Path Sum
  4. android报表图形引擎(AChartEngine)demo解析与源码
  5. 事关Animation Tree的工作随笔(一)
  6. ZJUTACM(hd1259)
  7. CodeForces 228D. Zigzag(线段树暴力)
  8. 浅析ThreadLocal
  9. Spring异常处理@ExceptionHandler
  10. Hive命令及操作
  11. 使用Eclipse+jlink调试STM32
  12. C# 会话,进程,线程,线程安全
  13. vs2010提取资源
  14. SpringBoot系列之Hikari连接池
  15. FastReport 保存为文件
  16. mysql数据库优化(二)
  17. PAT甲级 1127. ZigZagging on a Tree (30)
  18. 人民币-欧元预测(ARIMA算法)代码
  19. hadoop 基础视频1
  20. libuv在mingw下编译

热门文章

  1. 四探循环依赖 → 当循环依赖遇上 BeanPostProcessor,爱情可能就产生了!
  2. 实战 | 关于随手一点就发现XSS漏洞这件事
  3. RFC2889广播时延测试——网络测试仪实操
  4. Smartbi研究院分享:数据仓库的五大特点
  5. 思迈特软件Smartbi的特色功能有哪些?
  6. 运维人员常用的Linux命令总结
  7. 安装Android studio 并成功运行
  8. Python:collections.Counter
  9. 报错:net::err_unknown_url_scheme的解决办法
  10. JZ-047-求 1+2+3+...+n