Kafka篇——Kafka实战线上问题优化之防止消息丢失和消息重复消费,提供真实解决方案

  一、防止消息丢失
1、生产者方:设置ack为1或-1/all可以防止生产的消息丢失,如果要做到生产消息成功率99.9999%,ack设置成all,把min.insync.replicas配置成分区备份数
因为我们把ack设置成1或者-1/all,这样生产者生产的消息发送到broker中,会等待leader或者至少leader和一个副本同步到消息才会返回ack,如果生产者同步消息失败,会进行重试

2、消费者方:把自动提交改为手动提交offset

二、防止消息重复消费
一条消息被消费者消费多次,如果为了消息的不重复消费,而把生产端的重试机制关闭、消费端的手动提交改成自动提交,这样反而会导致消息的丢失。

消息重复消费的场景:

由于生产者端设置了发送消息的ack为1,并且生产者把消息发送到集群并且leader已经拿到消息,正好在返回ack的时候产生了网络波动,生产者拿不到broker返回的ack所以触发了重试机制,又一次给broker发送了这条消息。那么此时消费者就会从broker中poll到两条相同的消息。

那么解决方案是直接在防止消息丢失的手段上再加上消费消息时的幂等性操作,就能解决消息的重复消费问题

幂等性如何保证?
MySQL插入业务id作为主键,主键是唯一的,所以同一条消息只能插入一条,插入第二条业务id相同的消息就会报错 
或者使用联合主键

至此,关于如何解决Kafka中的防止消息丢失和消息重复消费介绍完毕,后续还会持续更新,敬请期待!

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 为了防止 Kafka 消息重复消费,可以采取以下几种方法: 1. 使用消费者组:Kafka 允许多个消费者以同一个消费者组的形式订阅同一个主题。当消息被发送到主题时,同一个消费者组中的消费者只会有一个消费者能够接收到消息。这就保证了每个消息只会被消费一次。如果需要进行消息重试,则需要使用不同的消费者组。 2. 使用消息偏移量(offset):Kafka 中每个分区都有一个唯一的偏移量,用于表示分区中已经被消费消息的位置。消费者可以记录下自己消费到的最后一个偏移量,并在下次启动时从该偏移量处开始消费。这种方式可以避免重复消费,但是需要注意,如果消费者处理消息失败,可能会导致消息被跳过而未被处理。 3. 使用幂等性生产者:幂等性生产者可以确保每个消息只会被发送一次,即使出现了网络故障或者其他异常情况。这样可以避免重复发送消息,从而避免重复消费。 4. 使用去重表:消费者可以使用一个去重表来记录已经消费过的消息,每次消费消息时先查询去重表,如果消息已经存在,则可以跳过该消息。这种方式可以避免重复消费,但是需要注意,去重表需要占用一定的内存空间,并且需要考虑去重表的并发访问问题。 ### 回答2: kafka是一种高吞吐量的分布式消息系统,但在际应用中,消息重复消费是一个常见的问题。为了解决这个问题kafka提供了以下几种机制来防止消息重复消费: 1. 分区复制:kafka消息分发到多个分区,并且可以将每个分区的副本分布在不同的Broker上。当消费者进行消费时,只有一个消费者可以消费同一个分区的消息,其他消费者无法消费相同的消息。这样可以保证消息在同一个分区内不会被重复消费。 2. 消费者组:kafka允许多个消费者组同时消费同一个主题的消息。每当一个新的消费者组加入时,kafka会为该消费者组分配一个独立的消费例。不同消费者组之间独立消费,可以避免重复消费。 3. 消息偏移量:kafka使用消息偏移量(offset)来标识消息在分区中的位置。消费者通过管理偏移量来确定下一个要消费消息消费者在消费完一个消息后,会将偏移量提交给kafkakafka会保存最新的偏移量。当消费者再次启动后,会从上一次提交的偏移量开始消费,从而避免重复消费。 4. 消费者日志:kafka提供了一个特殊的主题__consumer_offsets,用于保存消费者的偏移量信息。每个消费者组的偏移量会被写入这个主题,当消费者启动时,会从这个主题读取之前提交的偏移量,以便从之前的位置继续消费。 综上所述,kafka通过使用分区复制、消费者组、消息偏移量和消费者日志等机制,有效地防止消息重复消费。这些机制结合起来,保证了消息的可靠性和一致性,使得kafka成为一个可靠的分布式消息系统。 ### 回答3: Kafka通过以下几种机制来防止消息重复消费: 1. 分区偏移量(Partition Offset):每个消费者在消费消息时会维护一个分区偏移量,用来标识已经消费消息的位置。消费者可以定期提交其消费的偏移量到Kafka集群,以便记录消费的进度。当消费者重新启动后,可以从上一次提交的偏移量位置继续消费,避免对同一条消息进行重复消费。 2. 消费者组(Consumer Group):在Kafka中,多个消费者可以组成一个消费者组,每个分区只能被同一个消费者组中的一个消费消费。这样可以保证一个消息只会被同一个消费者组中的一个消费消费一次,避免了重复消费问题。 3. 提交消费偏移量(Commit Offset):消费者在消费消息后,可以手动或自动将消费的偏移量提交给Kafka集群。当消费者发生故障或重新启动时,可以通过已提交的偏移量来恢复消费进度,继续消费消费消息。 4. 消息的幂等性(Message Idempotence):生产者可以设置消息的幂等性,确保同一消息可以被多次发送但只被消费一次。Kafka通过消息的唯一标识来判断是否是重复消息,如果一个生产者发送了多条相同消息,只有第一条消息会被写入Kafka并被消费,后续相同的消息会被认为是重复消息而被忽略。 通过以上机制,Kafka可以有效地防止消息重复消费消费者可以通过维护分区偏移量和消费者组的方式来保证消息只被消费一次,同时可以通过提交消费偏移量和使用幂等性消息防止重复消费问题

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Be explorer

若认可笔者文章,手头富裕盼支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值