赞
踩
一、防止消息丢失
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中的防止消息丢失和消息重复消费介绍完毕,后续还会持续更新,敬请期待!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。