Kafka 如何保证消息不丢失

1、生产者

1.1 丢失原因:

  • kafka生产端异步发送消息后,不管broker是否响应,立即返回,伪代码producer.send(msg),由于网络抖动,导致消息压根就没有发送到broker端;
  • kafka生产端发送消息超出大小限制,broker端接到以后没法进行存储;

1.2 解决方案:

  • 1、生产者调用异步回调消息。伪代码如下: producer.send(msg,callback);
  • 2、生产者增加消息确认机制,设置生产者参数:acks = all。partition的leader副本接收到消息,等待所有的follower副本都同步到了消息之后,才认为本次生产者发送消息成功了;
  • 3、生产者设置重试次数。比如:retries>=3,增加重试次数以保证消息的不丢失;
  • 4、定义本地消息日志表,定时任务扫描这个表自动补偿,做好监控告警。
  • 5、后台提供一个补偿消息的工具,可以手工补偿。

2、Broker

2.1 丢失原因:

kafka broker集群接收到数据后会将数据进行持久化存储到磁盘,消息都是先写入到页缓存,然后由操作系统负责具体的刷盘任务或者使用fsync强制刷盘,如果此时Broker宕机,且选举一个落后leader副本很多的follower副本成为新的leader副本,那么落后的消息数据就会丢失。

2.2 解决方案:

  • 1、同步刷盘(不太建议)。同步刷盘可以提高消息的可靠性,防止由于机器掉电等异

你可能感兴趣的:(Kafka,kafka,分布式,java,学习,开发语言)