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进行提交,导致消息丢失。为了尽可能的保证数据的完整性,尽量选用手动提交的方式。

        
  

posted on 2020-05-30 09:53  溪水静幽  阅读(330)  评论(0)    收藏  举报