一、kafka保障消息不丢失
kafka的消息传输是从生产者发送消息开始一直到消费者接受消息的完整过程,在这个过程中的各个阶段都可能发生消息丢失,因此,为保障消息不丢失,我们应该完整的考虑到每个阶段。
1.生产者发送消息
在生产者发送消息的阶段,我们可以采用异步回调发送的方式,如果消息发送失败,可以通过回调的方式,获取到失败后的消息,可通过重新发送或者记录日志后续补偿来解决发送失败的问题;也可以通过设置消息重试,解决网络抖动导致的消息发送失败。
2.broker中消息丢失
broker中的消息丢失可以通过kafka的复制机制来解决,在生产者发送消息的时候,设置一个确认机制acks,将参数设置为all,这样在发送消息到分区的时候,不仅保证了broker的复制成功,同时也能在follwer分区保证保存确认;只有当所有的副本都保存确认之后才算是消息发送成功,这样就在很大程度上保证了消息不会在broker丢失。
3.消费者端接受消息丢失
kafka消息的消费都是通过offset进行标记消费的,消费者默认是自动按期提交已经消费的偏移量,默认是5s提交一次。如果出现重平衡的消息,就会出现重复消费或者消息丢失;这种情况下,一般都是通过禁用自动提交偏移量,改为手动提交的方式,当消费者消费消息成功后再报告给broker消费的位置,这样就避免了消息的丢失或者重复消费。
二、kafka设置手动提交
1.配置消费者参数:enable.auto.commit=false;
2.在消费者中,通过调用poll()方法来获取消息,消息处理完成后,通过调用commitSync()方法来手动提交偏移量。