Kafka生产中的一些常见问题记录

本文探讨了Kafka生产中可能导致消息丢失的各个环节,包括生产者、broker端和消费者端的问题,以及采取拉取而非推送的原因。针对消息丢失,提出了消费者限速、手动提交位移等解决方案,并分析了Kafka的复制策略。
摘要由CSDN通过智能技术生成

消息丢失

要解决消息不丢的问题,要从整个链路去看,只有保证全链路的不丢失,才能完全保证消息不丢

生产者

生产者保证消息不丢的方式,网上的教程很多,无非就是配置ACK级别,增加重试,非常重要的消息,可以尝试无限重试(个人并不觉得是个好的解决方案),感觉重试一定次数之后,仍然失败的消息,持久化即可,后续认为介入处理或者定时任务进行重试处理,这样的话需要考虑消息量大的时候,持久化方式的承受能力,一般mysql数据库的承受能力约千TPS级别(也是要看机器配置,可以参考一下腾讯云做的性能测试)。

broker端

默认情况下,当 acks=all 时,一旦所有同步副本ISR都收到消息,就会发生确认。

broker端如何保证数据不丢失,这个可以参考一些书籍,如深入理解Kafka:核心设计与实践原理,一般是刷盘前宕机导致数据丢失,如果ack=all的时候,按理来说这种丢失概率很小,只有未刷盘前,leader和整个ISR都挂掉才可能出现数据丢失,否则应该不会出现(有点忘了TODO

消费者端

默认的消费者会批量拉取消息,然后自动提交位移,具体的拉取量可以自己配置。

如果是同步的消费方式,消息拉过来,消费了一部分消息之后消费者重启或者重新部署了之后,位移是没有提交的,这时候重启之后就会出现重复消费的情况,这个消费端自己做幂等即可,幂等实现方案包括常见的数据库唯一索引等,网上一大堆。

但是常见的消费模型是异步的,也就是说一个消费线程拉取消息,然后多个线程(线程池)去并行消费消息,异步消息的消费线程不会阻塞拉取线程,因此拉取完消息,就自动提交了位移,这样常见的问题就是消费者会不断的拉取消息,消息量大的情况下,如果不做处理,会导致潜在的OOM异常。

常见的解决方案是消费端进行限速(别的方案如broker端限速

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生产环境排查 Kafka 是否存在重复消费可以通过以下几种方式进行: 1. 查看消费者组偏移量:Kafka 提供了一套用于管理消费者组偏移量的 API。你可以通过查看消费者组的偏移量来确定是否存在重复消费。使用 Kafka 提供的命令行工具(如 kafka-consumer-groups.sh)或者编写自定义代码来获取消费者组的偏移量信息。 2. 监控消费者消费速度:通过监控消费者的消费速度,可以判断是否存在重复消费。如果消费者的消费速度明显低于生产者的产生速度,可能会导致重复消费。可以通过监控消费者的消费延迟、消费速率等指标来判断是否存在重复消费。 3. 消费者记录去重:在消费者端可以引入一定的逻辑来进行消费记录的去重。可以使用一些唯一标识(如消息的唯一 ID)来判断是否已经消费过该消息。消费者收到消息后,先判断该消息是否已经被消费过,如果已经消费过,则跳过该消息。 4. 监控日志:通过监控 Kafka 的日志可以发现是否存在重复消费的异常情况。可以查看消费者日志是否有重复消费的记录,以及是否有消费异常等情况。 5. 数据库记录:如果消息被消费后需要写入数据库,可以通过数据库记录来排查是否存在重复消费。可以根据消息的唯一标识在数据库进行查询,判断是否已经存在该消息的记录。 以上是一些常见的排查方法,根据具体情况选择适合的方式来排查 Kafka 是否存在重复消费。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值