Kafka丢失消费
发送消息
Kafka消息发送有两种方式:同步(sync)和异步(async),默认是同步方式,可通过producer.type属性进行配置。Kafka通过配置request.required.acks属性来确认消息的生产:
0---表示不进行消息接收是否成功的确认; 1---表示当Leader接收成功时确认; -1---表示Leader和Follower都接收成功时确认;
有6种消息生产的情况,下面分情况来分析消息丢失的场景:
(1)acks=0,不和Kafka集群进行消息接收确认,则当网络异常、缓冲区满了等情况时,消息可能丢失;
(2)acks=1、同步模式下,只有Leader确认接收成功后但挂掉了,副本没有同步,数据可能丢失;
消费消息
消费方丢失的情况,是因为在消费过程中出现了异常,但是 对应消息的 offset 已经提交,那么消费异常的消息将会丢失。
offset的提交包括手动提交和自动提交,可通过kafka.consumer.enable-auto-commit进行配置。
手动提交可以灵活的确认是否将本次消费数据的offset进行提交,可以很好的避免消息丢失的情况。
自动提交是引起数据丢失的主要诱因。因为消息的消费并不会影响到offset的提交。
自动提交的触发事件:
通过 KafkaConsumer.assign()订阅分区
ConsumerCoordinator.poll()方法处理时(maybeAutoCommitOffsetsAsync方法)
在消费者进行平衡操作前
ConsumerCoordinator 关闭操作
如在消息消费中出现异常,在下次拉取数据之前,会执行ConsumerCoordinator.poll()方法,从而将当前消息的offset进行提交,导致消息丢失。为了尽可能的保证数据的完整性,尽量选用手动提交的方式。
立志如山 静心求实
浙公网安备 33010602011771号