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、同步刷盘(不太建议)。同步刷盘可以提高消息的可靠性,防止由于机器掉电等异