在 Kafka 工作机制 一文提及了 Kafka 消息的不可靠性。本文就 Kafka 消息的三种不可靠性(重复、丢失、乱序),分析它们出现的内部原因和解决办法。

作者:王克锋
出处:https://kefeng.wang/2017/11/22/kafka-reliability/
版权:自由转载-非商用-非衍生-保持署名,转载请标明作者和出处。

1 Kafka 消息的问题

Kafka就比较适合高吞吐量并且允许少量数据丢失的场景,如果非要保证“消息只读取一次”,可以使用JMS。
参考: http://blog.csdn.net/u012050154/article/details/78592854

Kafka Producer 消息发送有两种方式(配置参数 producer.type):

  • producer.type=sync(默认值): 后台线程中消息发送是同步方式,对应的类为 kafka.producer.SyncProducer;
  • producer.type=async: 后台线程中消息发送是异步方式,对应的类为 kafka.producer.AyncProducer;优点是可批量发送消息(消息个数达到 batch.num.messages=200 或时间达到 “ 时发送)、吞吐量佳,缺点是发送不及时可能导致丢失;

对于同步方式(producer.type=sync)?Kafka Producer 消息发送有三种确认方式(配置参数 acks):

  • acks=0: producer 不等待 Leader 确认,只管发出即可;最可能丢失消息,适用于高吞吐可丢失的业务;
  • acks=1(默认值): producer 等待 Leader 写入本地日志后就确认;之后 Leader 向 Followers 同步时,如果 Leader 宕机会导致消息没同步而丢失,producer 却依旧认为成功;
  • acks=all/-1: producer 等待 Leader 写入本地日志、而且 Leader 向 Followers 同步完成后才会确认;最可靠。

Kafka Consumer 有两个接口:

  • Low-level API: 消费者自己维护 offset 等值,可以完全控制;
  • High-level API: 封装了对 parition 和 offset 的管理,使用简单;可能遇到 Consumer 取出消息并更新了 offset,但未处理消息即宕机,从而相当于消息丢失;

Kafka 支持 3 种消息传递语义:

  • 最多一次 -消息可能会丢失,但永远不会重新发送。consumer.poll(); consumer.commitOffset(); processMsg(messages);
  • 至少一次 -消息永远不会丢失,但可能会重新传递。consumer.poll(); processMsg(messages); consumer.commitOffset();
  • 恰恰一次 - 这就是人们真正想要的,每条信息只传递一次。以事务来保证。

2 消息重复

  • 根本原因:已经消费了数据,但是 offset 没提交。
  • 外在原因:(1)消费数据后、提交 offset 前,线程被杀;
    (2)设置 offset 为自动提交,consumer.close() 之前 consumer.unsubscribe();
    (3)consumer 取了一批数据,尚未处理完毕时,达到了 session.timeout.ms,导致没有接收心跳而挂掉,自动提交offset失败,下次会重复消费本批消息;
  • 解决办法:(1)唯一 ID 保存在外部介质中,每次消费时根据它判断是否已处理;
    (2)如果在统计用,丢失几条关系不大,则无需理会;
    (3)如果消费者来不及处理,可以这样优化:增加分区以提高并行能力;增加消费者线程;关闭自动提交 enable.auto.commit=false

3 消息丢失

  • 根本原因:已经提交了 offset,但数据在内存中尚未处理,线程就被杀掉。
    同步模式下,确认机制设置为-1(不可为1),即让消息写入Leader和Follower之后再确认消息发送成功;
    异步模式下,设置为不限制阻塞超时时间(不可为acks=0),当缓冲区满时不清空缓冲池,而是让生产者一直处于阻塞状态;

4 消息乱序

传统的队列,在并行处理时,由于网络故障或速度差异,尽管服务器传递是有序的,但消费者接收的顺序可能不一致;
Kafka 在主题内部有分区,并行处理时,每个分区仅由消费者组中的一个消费者使用,确保了消费者是该分区的唯一读者,并按顺序使用这些数据。
但是它也仅仅是保证Topic的一个分区顺序处理,不能保证跨分区的消息先后处理顺序,除非只提供一个分区。

Kafka 消息可靠性相关推荐

  1. kafka 同步提交 异步_腾讯游戏工程师分享:简单理解 Kafka 的消息可靠性策略

    作者:hymanzhang,腾讯 IEG 运营开发工程师 背景 部门的开发同学最近在开发一个活动的过程中,需要关注大量的应用后台逻辑,捕捉各种事件的触发.在设计时打算采用 kafka 消息队列进行业务 ...

  2. 简单理解 Kafka 的消息可靠性策略

    作者:hymanzhang,腾讯 IEG 运营开发工程师 背景 部门的开发同学最近在开发一个活动的过程中,需要关注大量的应用后台逻辑,捕捉各种事件的触发.在设计时打算采用 kafka 消息队列进行业务 ...

  3. 【Kafka】Kafka数据可靠性深度解读

    2019独角兽企业重金招聘Python工程师标准>>> Kafka起初是由LinkedIn公司开发的一个分布式的消息系统,后成为Apache的一部分,它使用Scala编写,以可水平扩 ...

  4. kudu接受kafka消息_Kafka入门详解

    1.1 什么是kafka? Kafka最初由Linkedin公司开发,是一个分布式.支持分区的(partition).多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的 ...

  5. 异步发送,那消息可靠性怎么保证?

    消息丢失可能发生在生产者发送消息.MQ本身丢失消息.消费者丢失消息3个方面. 生产者丢失 生产者丢失消息的可能点在于程序发送失败抛异常了没有重试处理,或者发送的过程成功但是过程中网络闪断MQ没收到,消 ...

  6. kafka数据可靠性深度解读

    本文收录于InfoQ,未经允许不得转载. 欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客 ...

  7. kafka消息消费有延迟_消息中间件选型分析---从Kafka与RabbitMQ的对比来看全局

    有很多网友留言:公司要做消息中间件选型,该如何选?你觉得哪个比较好?消息选型的确是一个大论题,实则说来话长的事情又如何长话短说.对此笔者专门撰稿一篇内功心法:如何看待消息中间件的选型,不过这篇只表其意 ...

  8. 面试基操:MQ怎么保障消息可靠性?

    面试官:在MQ的整个消息生产消费过程中,如何保障消息100%被消费? 候选人:MQ有个ACK机制,确保消息100%被消费. 面试官:好吧,可以回去等通知了-- 这道面试题在考察MQ组件时算是老生常谈了 ...

  9. kafka 数据可靠性深度解读

    文章目录 kafka 数据可靠性深度解读 多分区.多副本 多分区的设计的特点: kafak 分区 leader 机制 kafka 数据可靠性深度解读 多分区.多副本 kafka 的消息保存在Topic ...

最新文章

  1. PhpStorm升级后调用某些类提示phpstorm Unhandled exceptions
  2. 【AI白身境】深度学习中的数据可视化
  3. mysql主从复制、基于GTID的主从、半同步
  4. mql 查询多结果_明世告诉你!广东成考成绩、录取结果怎么查?(附最低分数线)...
  5. pythonifnotnone_python中if not x: 和 if x is not None: 和 if not x is None的使用和区别
  6. 备忘--简单比较SPSS、RapidMiner、KNIME以及Kettle四款数据分析工具
  7. Delphi实现文件下载UrlDownloadToFile
  8. winserve2016 万能驱动网卡_windows server 2016 安装有线网卡驱动
  9. 知识图谱01:知识图谱的定义
  10. html 隐藏tbody,隐藏的tbody
  11. 极简试用期转正述职报告PPT模板
  12. C++ 实现tring字符串trim函数和split函数
  13. HTML5七夕520情人节表白网页❤ 属于我们的浪漫星空 ❤ HTML+CSS+JavaScript
  14. 【原创】畅言实现单点登录的设计流程和技术细节(2/2)
  15. windows建立隐藏账户
  16. 怎么办理高新技术企业认定高新技术企业认定流程
  17. x98air2+android+升级,台电X98 Air 3G(C5J6)升级安卓5.0,windows系统不受影响
  18. 数字电路实验(一)——译码器
  19. 2016 IT 互联网 各大公司内推
  20. 手把手教你在64位Win7下部署16位汇编学习环境

热门文章

  1. HTML5七夕情人节表白网页制作【html5全屏七夕表白页面滚动模板】HTML+CSS+JavaScript
  2. “十一黄金周” 绵山笑迎五湖四海宾客
  3. 上班5年,月薪2万,存款不到10万,疫情期间我慌了...
  4. Spring Cloud GateWay系列(三):路由规则动态刷新
  5. java如何打印当前月份日历_java打印指定年月份的日历
  6. 2021年深圳市公交线网和地铁线网数据
  7. 高频变压器的设计与制作
  8. 铁路施工智慧建造解决方案
  9. Softmax分类器基本实现
  10. 为影驰主板运行Windows11开启fTPM2.0(Intel PTT)可信计算支持