1. Kafka消息可靠性传输/如何保证消息不丢失
在发送消息到消费者接收消息,每个阶段都可能会丢失消息,所以解决方案也是从多个方面考虑。
第一个是生产者发送消息的时候,可以使用异步回调发送,如果消息发送失败,可以通过回调获取失败后的消息信息,可以考虑重试或者记录日志,后面在做补偿就可以。同时在生产者这边还可以设置消息重试,有的时候是由于网络抖动的原因导致发送不成功,就可以使用重试机制来解决
第二个在broker中消息有可能会丢失。可以通过Kafka的复制机制来确保消息不丢失。在生产者发送消息的时候,可以设置一个acks,就是确认机制。我们可以设置参数为all,这样的话,当生产者发送消息到了分区之后,不仅仅只在leader区保存确认,在follwer区也会保存确认,只有当所有的副本都保存确认以后才算是成功发送了消息,所以,这样设置就很大程度上保证了消息不会在broker丢失。
第三个有可能是在消费者端丢失消息。Kafka消费消息都是按照offset进行标记消费的,消费者默认是自动按期提交已经消费的偏移量,默认是每隔5s提交一次,如果出现重平衡的情况,可能会重复消费或者丢失数据。一般会禁用掉自动提交偏移量,改为手动提交,当消费成功后再报告给broker消费的位置,这样就可以避免消息丢失和重复消费了。
2. Kafka如何防止消息重复消费/消息消费的幂等性
首先kafka的broker上存储的消息,都有一个offset标记,Kafka的消费者是通过offset标记来维护当前已经消费的数据,每消费一批数