1. 生产者层面
异步发送与回调处理
- 异步发送方式:生产者一般使用异步方式发送消息,异步发送有消息和回调接口两个参数。在回调接口的重写方法中,可通过异常参数判断消息发送状态。若消息发送成功,异常参数为null;若发送失败,可记录日志,并重发消息或后期补偿。
重试机制
- 解决网络抖动问题:针对消息发送失败(如网络抖动),可利用Kafka提供的重试机制,通过配置设置重试次数,解决因网络不稳定导致的消息发送失败问题,确保消息发送成功。
2. Broker层面
发送确认机制acks
- acks值含义:ack有三个值(0、1、all),代表broker分区中保存数据的确认情况。
- ack = 0时,生产者无需broker响应确认就认为消息发送成功,效率最高但消息丢失概率大;
- ack = 1(默认值),leader副本保存成功后给生产者发送确认,生产者收到确认后认为消息发送成功;
- ack = all 时,所有副本都成功保存数据后才给生产者发送确认,性能最低但能最大程度保证消息不丢失。
- 实际生产环境中,最低应设置ack = 1。
3. 消费者层面
手动提交偏移量
- 避免自动提交问题:默认情况下消费者每隔五秒自动提交消费偏移量,在重平衡过程中可能导致重复消费或丢失数据。
- 为解决此问题,需禁用自动提交偏移量功能,改为手动提交。
- 消费数据时,消费多少就提交多少偏移量,若消费者宕机则不提交,确保偏移量准确,避免重复消费或丢失。
同步加异步组合提交
- 组合提交优势:Kafka提供了同步提交和异步提交两种方式。同步提交会阻塞,异步提交虽不阻塞但可能因消费失败导致偏移量不准确,所以采用同步加异步组合提交是较好的选择。具体代码为在消费完消息后先设置异步提交,最后在finally代码块中设置同步提交。
4. 消息重复消费问题
手动提交与幂等方案
- 解决重复消费步骤:解决消息重复消费问题与解决消费者消息丢失问题类似,第一步也是关闭自动提交偏移量,开启手动提交偏移量,提交方式采用同步加异步。若仍担心消息重复,可增加幂等方案。
重平衡概念及触发条件
- 概念:重平衡是指在Kafka消费者组中,当消费者组成员发生变化(如消费者加入或离开)或订阅的主题分区发生变化时,Kafka会重新分配每个消费者负责的分区,以实现负载均衡的过程。
- 触发条件:消费者组内消费者数量变化(如消费者加入或离开)、订阅主题分区变化、消费者主动发起重平衡请求等情况会触发重平衡。
重平衡可能导致的问题
- 重复消费:默认情况下消费者每隔五秒自动提交消费偏移量。若消费者在消费过程中提交偏移量不及时(如已消费到偏移量6,但只提交到3),当发生重平衡后,新接手该分区的消费者会从上次提交的偏移量(3)继续往后消费,导致3 - 6之间的数据重复消费。
- 数据丢失:若消费者宕机前提交的偏移量大于实际消费的偏移量(如实际消费到1,但偏移量提交到3),新接手的消费者从3继续消费,1 - 2之间的数据就会丢失。
解决重平衡导致问题的方法
- 手动提交偏移量:禁用自动提交偏移量功能,改为手动提交。在代码中,消费多少数据就提交多少偏移量,如果消费者宕机则不提交,确保偏移量准确,避免重复消费或丢失。
- 同步加异步组合提交偏移量:Kafka提供了同步提交和异步提交两种方式。同步提交会阻塞,异步提交虽不阻塞但可能因消费失败导致偏移量不准确,所以采用同步加异步组合提交是较好的选择。具体代码为在消费完消息后先设置异步提交,最后在finally代码块中设置同步提交。