kafka 如何保证消息不丢失

从三个方面进行:

 

1、生成者Producer:确保消息“安全发出”

  生产者的核心任务是确保消息被Kafka集群成功接收并持久化。

  1)设置acks=all 等待所有的ISR副本确认 

  2)retries 开启和 幂等性设计

  3)消息同步或者异步发送 + 回调:在兼顾性能的同时,通过Callback监听发送结果,失败时记录日志或进行补偿处理。

 

2、服务端Broker:确保消息“安全存储”

  1)配置合理的副本因子 (replication.factor):为Topic设置至少3个副本,确保单个Broker宕机时数据不丢失。

  2)设置最小同步副本数 (min.insync.replicas):与acks=all配合使用,定义至少多少个ISR副本确认才算写入成功。建议设置为2(副本数为3时)。这保证了即使Leader宕机,新选举的Leader也包含已确认的消息。

  3)禁止不同步副本成为Leader (unclean.leader.election.enable=false):强烈建议设为false。这能防止落后太多的副本被选为Leader,从而避免已确认消息的丢失。

 

3、消费者Consumer:确保消息“被完整处理”

  1)关闭自动提交位移 (enable.auto.commit=false):必须关闭自动提交,因为自动提交可能导致消息还没处理完就被标记为已消费,若消费者随后崩溃,消息就丢失了。

  2)采用“先处理,后提交”的手动提交策略:在处理完业务逻辑后,再手动提交位移(Offset)。推荐使用同步提交 (commitSync()),确保提交成功后再进行下一轮消费。

posted @ 2023-06-27 09:11  方达达  阅读(2)  评论(0)    收藏  举报