Kafka重复消费、消息丢失、消息乱序
一、应用场景
- 大量扫码/刷卡交易订单日志传输
- 日志采集
二、产生原因
- 日志采集客户端(Producer):
- 超时重传,日志重复(enable.idempotence=false重复发送)
- 消息失败,未持久化(acks=0不重试;或acks=1但leader闪退)
- 批量发送,数据乱序(max.in.flight.requests.per.connection>1批量发送)
- Kafka服务器:
- OSR参与选举,导致消息丢失(unclean.leader.election.enable=true脱节选举)
- ISR列表为1或空,未备份(min.insync.replicas<=1副本过少)
- 日志处理应用(Consumer):
- 消费异常,消息丢失(enable-auto-commit=true自动提交)
- 未提交Offset,重复消费(异常闪退和重平衡)
三、解决方案
-
日志采集客户端(Producer):
## 解决乱序问题 ## 批量发送改为每次逐个发送,默认5 max.in.flight.requests.per.connection=1 ## 解决重复生产 ## 每个ProducerId全局唯一;ack=all和retries>1保证持久化 enable.idempotence=true ack=all retries=2 ## 转移处理异常生产 -
Kafka服务器:
## 解决数据丢失问题 ## 禁止OSR参与选取leader unclean.leader.election.enable=false ## ISR列表至少2个以上 min.insync.replicas=2 -
日志处理应用(Consumer):
## 解决消息丢失 ## 禁止自动提交 enable.auto.commit=false ## 重复消费 ## 接口幂等性;MySQL记录每一个Offset消费状态;
四、参数
| 参数 | 作用和优点 | 缺点 |
|---|---|---|
| max.in.flight.requests.per.connections=1 | 生产者发送缓冲池(flight)只缓冲一个消息记录,避免乱序;类似同步队列AQS,一次只能发送一个 | 吞吐量下降 |
| enable.idempotence=true | 生产者维护全局唯一producerId,避免重复;类似主键,重复数据不会重复持久化 | retries=2配合 |
| acks=all | 生产者要求Kafka持久化所有ISR,保证持久化;类似全同步复制 | ISR列表可能空或只有leader;min.insync.replicas=2配合 |
| retries=2 | 生产者超时重发次数,保证持久化;类似超时重传 | 可能造成重复持久化;enable.idempotence=true配合 |
| unclean.leader.election.enable=false | Kafka中OSR参数竞选Leader,保证Kafka高可用; | OSR消息脱节,造成大量数据丢失;不开启 |
| min.insync.replicas=2 | Kafka中ISR至少2个,保证持久化;类似半同步复制 | acks=all配合 |
| enable.auto.commit=false | 消费者关闭自动提交,避免消息丢失;类似事务提交 | 需要额外维护Offset,容易造成重复消费,需要消费幂等性 |
本文来自博客园,作者:SArtOnline,转载请注明原文链接:https://www.cnblogs.com/sartonline/p/16165142.html
浙公网安备 33010602011771号