使用Kafka时如何确保消息不丢失

可靠性的提高一定程度会降低吞吐量

Topic配置

  1. 配置多个消息副本

消息生产者侧

  1. 使用同步发送
  2. 根据业务需要,设置ack为1或all(设置1时leader写入完成则确认,设置all时至少指定个数的leader、follower写入完成时确认),确保收到Kafka响应后,消息已成功写入Kafka集群,并存在消息副本
  3. 设置重试次数,尽可能减少投递失败导致的消息丢失
  4. 消息可靠性要求高,多次重试后可将失败消息记录到数据库中,定时轮询或通过其他机制,再次补偿发送

Kafka集群侧

  1. 不允许开启OSR可选举为主分区,避免主分区节点(Broker)挂掉后,不可靠的OSR节点成为主分区,导致消息丢失
  2. 数据写入缓存页后,默认为异步刷盘,根据业务需要,可修改为同步刷盘,但是会降低吞吐量

消息消费者侧

  1. 关闭自动提交(Commit)offset
  2. 在完成消息处理后,再手动Commit,此时可能带来重复消费的问题,因此需要在消费逻辑中保持幂等