Kafka到底会不会丢数据(data loss)? 通常不会,但有些情况下的确有可能会发生。下面的参数配置及Best practice列表可以较好地保证数据的持久性(当然是trade-off,牺牲了吞吐量)。笔者会在该列表之后对列表中的每一项进行讨论,有兴趣的同学可以看下后面的分析。

  1. block.on.buffer.full = true
  2. acks = all
  3. retries = MAX_VALUE
  4. max.in.flight.requests.per.connection = 1
  5. 使用KafkaProducer.send(record, callback)
  6. callback逻辑中显式关闭producer:close(0)
  7. unclean.leader.election.enable=false
  8. replication.factor = 3
  9. min.insync.replicas = 2
  10. replication.factor > min.insync.replicas
  11. enable.auto.commit=false
  12. 消息处理完成之后再提交位移

给出列表之后,我们从两个方面来探讨一下数据为什么会丢失:

1. Producer端

  目前比较新版本的Kafka正式替换了Scala版本的old producer,使用了由Java重写的producer。新版本的producer采用异步发送机制。KafkaProducer.send(ProducerRecord)方法仅仅是把这条消息放入一个缓存中(即RecordAccumulator,本质上使用了队列来缓存记录),同时后台的IO线程会不断扫描该缓存区,将满足条件的消息封装到某个batch中然后发送出去。显然,这个过程中就有一个数据丢失的窗口:若IO线程发送之前client端挂掉了,累积在accumulator中的数据的确有可能会丢失。

  Producer的另一个问题是消息的乱序问题。假设客户端代码依次执行下面的语句将两条消息发到相同的分区

producer.send(record1);
producer.send(record2);

如果此时由于某些原因(比如瞬时的网络抖动)导致record1没有成功发送,同时Kafka又配置了重试机制和max.in.flight.requests.per.connection大于1(默认值是5,本来就是大于1的),那么重试record1成功后,record1在分区中就在record2之后,从而造成消息的乱序。很多某些要求强顺序保证的场景是不允许出现这种情况的。

  鉴于producer的这两个问题,我们应该如何规避呢??对于消息丢失的问题,很容易想到的一个方案就是:既然异步发送有可能丢失数据, 我改成同步发送总可以吧?比如这样:

producer.send(record).get();

这样当然是可以的,但是性能会很差,不建议这样使用。因此特意总结了一份配置列表。个人认为该配置清单应该能够比较好地规避producer端数据丢失情况的发生:(特此说明一下,软件配置的很多决策都是trade-off,下面的配置也不例外:应用了这些配置,你可能会发现你的producer/consumer 吞吐量会下降,这是正常的,因为你换取了更高的数据安全性)

  • block.on.buffer.full = true  尽管该参数在0.9.0.0已经被标记为“deprecated”,但鉴于它的含义非常直观,所以这里还是显式设置它为true,使得producer将一直等待缓冲区直至其变为可用。否则如果producer生产速度过快耗尽了缓冲区,producer将抛出异常
  • acks=all  很好理解,所有follower都响应了才认为消息提交成功,即"committed"
  • retries = MAX 无限重试,直到你意识到出现了问题:)
  • max.in.flight.requests.per.connection = 1 限制客户端在单个连接上能够发送的未响应请求的个数。设置此值是1表示kafka broker在响应请求之前client不能再向同一个broker发送请求。注意:设置此参数是为了避免消息乱序
  • 使用KafkaProducer.send(record, callback)而不是send(record)方法   自定义回调逻辑处理消息发送失败
  • callback逻辑中最好显式关闭producer:close(0) 注意:设置此参数是为了避免消息乱序
  • unclean.leader.election.enable=false   关闭unclean leader选举,即不允许非ISR中的副本被选举为leader,以避免数据丢失
  • replication.factor >= 3   这个完全是个人建议了,参考了Hadoop及业界通用的三备份原则
  • min.insync.replicas > 1 消息至少要被写入到这么多副本才算成功,也是提升数据持久性的一个参数。与acks配合使用
  • 保证replication.factor > min.insync.replicas  如果两者相等,当一个副本挂掉了分区也就没法正常工作了。通常设置replication.factor = min.insync.replicas + 1即可

2. Consumer端

  consumer端丢失消息的情形比较简单:如果在消息处理完成前就提交了offset,那么就有可能造成数据的丢失。由于Kafka consumer默认是自动提交位移的,所以在后台提交位移前一定要保证消息被正常处理了,因此不建议采用很重的处理逻辑,如果处理耗时很长,则建议把逻辑放到另一个线程中去做。为了避免数据丢失,现给出两点建议:

  • enable.auto.commit=false  关闭自动提交位移
  • 在消息被完整处理之后再手动提交位移

转载于:https://www.cnblogs.com/huxi2b/p/6056364.html

Kafka无消息丢失配置相关推荐

  1. kafka的消息丢失和重复消费解决办法

    1.消息发送 Kafka消息发送有两种方式:同步(sync)和异步(async),默认是同步方式,可通过producer.type属性进行配置.Kafka通过配置request.required.ac ...

  2. Kafka(Go)教程(九)---如何避免消息丢失?

    来自:指月 https://www.lixueduan.com 原文:https://www.lixueduan.com/post/kafka/09-avoid-msg-lost/ 本文主要从 Pro ...

  3. kafka数据不丢失不重复_如何配置 KAFKA 使其消息不会丢失

    不可靠的KAFKA 这里的不可靠是指代KAFKA其设计之初就为高性能而设计,其是允许消息丢失的,但经过多个版本的升级之后,通过KAFKA的相关配置,我们可以将其作为可靠的队列(不丢消息的队列). 在本 ...

  4. Kafka Consumer位移(Offset)提交——解决Consumer重复消费和消息丢失问题

    本文目录 1.Consumer 位移(offset) 1.2 位移(offset)的作用 2. 位移(offset)提交导致的问题 2.1 消息丢失 2.2 消息重复消费 3 Consumer位移提交 ...

  5. 微服务 消息中间件kafka消息丢失问题

    微服务 消息中间件kafka消息丢失问题 1. kafka消息丢失概述 1.1 kafka概述 1.2 kafka架构 1.3 kafka问题 2. kafka消息传递语义 3. kafka消息丢失问 ...

  6. 详解,最新整理,RabbitMQ,RocketMQ,Kafka 事务性,消息丢失,消息顺序性和消息重复发送的处理策略

    消息队列常见问题处理 分布式事务 什么是分布式事务 我们的服务器从单机发展到拥有多台机器的分布式系统,各个系统之前需要借助于网络进行通信,原有单机中相对可靠的方法调用以及进程间通信方式已经没有办法使用 ...

  7. RabbitMQ,RocketMQ,Kafka 事务性,消息丢失,消息顺序性和消息重复发送的处理策略

    消息队列常见问题处理 分布式事务 什么是分布式事务 我们的服务器从单机发展到拥有多台机器的分布式系统,各个系统之前需要借助于网络进行通信,原有单机中相对可靠的方法调用以及进程间通信方式已经没有办法使用 ...

  8. kafka消息丢失解决方案

    目录 一.生产端数据丢失 二.存储端消息丢失 三.消费端数据丢失 四.小结 一条消息从生产到消费完成这个过程,可以划分三个阶段,为了方便描述,我给每个阶段分别起了个名字. 生产阶段: 在这个阶段,从消 ...

  9. Kafka消息丢失、重复消费的解决方案

    文章目录 生产者问题 消费者问题 问题总结 解决方案 生产者问题 Producer发送消息到队列,分区Leader收到消息后返回ACK给Producer,表示接收成功,此时可以继续发送下一笔消息. K ...

最新文章

  1. thinkphp5带条件分页
  2. 2018年第九届蓝桥杯C/C++ C组国赛 —— 第二题:最大乘积
  3. 把 LiveData 用于事件传递那些坑
  4. 调试opencv程序显示应用程序无法正常启动,0xc000007b
  5. OkHttp+Stetho+Chrome调试android网络部分(原创)
  6. python3有什么用_Python 3.9的到来到底是意味着什么
  7. C51单片机学习思维导图
  8. 比特币开发者:BSC可能会超越以太坊成为顶级智能合约平台
  9. javascript cookies 存、取、删除实例【转】
  10. 关于 单窗口服务模型模拟 进行的小测试
  11. 文章中的代码添加语法高亮
  12. java 变量 string_java中String类型变量的赋值问题
  13. hive udf 分组取top1_Hive中UDF练习
  14. 测试环境是什么?怎样搭建出好的测试环境?
  15. Scala下载及安装(Windows)以及Idea中Scala项目的创建
  16. 无线渗透笔记(二)-《使用Aircrack-ng破解握手包》
  17. gridView---->列标题右键菜单管理
  18. 有一对兔子,从出生后的第 3 个月起每个月都生一对兔子。小兔子长到第 3 个月后每个月又生一对兔子,假设所有的兔子都不死,问 20 个月内每个月的兔子总数为多少?
  19. 12.12飞思卡尔芯片的prm mcp和映射理解
  20. Android修改字体大小

热门文章

  1. 数据库SQL Server 2019安装向导的“功能选择”详细说明(微软官方资料)
  2. Python使用you-get批量下载bilibili网站视频
  3. Access和SQL SERVER两种数据库的直接转换,不需要第三方工具
  4. 高校计算机实验管理人员会议,计算机科学学院召开实验室安全与管理工作会议...
  5. 怎么看c语言错误出在哪,请各位大佬帮我看看错误出在哪里
  6. python数学知识_数学知识回顾01
  7. softmax ce loss_神经网络中的蒸馏技术,从Softmax开始说起
  8. 父类没有异常,子类可以抛异常吗
  9. 009_CSS分组选择器
  10. 分布式锁和mysql事物扣库存_这个是真的厉害,高并发场景下的订单和库存处理方案,讲的很详细了!...