消费方式

  1. 拉模式:Kafka采用拉模式
  2. 推模式

    原因:每个消费者的消费能力可能都不一样,采用推模式的话不灵活

消费者工作流程

image.png

  1. 一个消费者可以消费多个分区内容
  2. 同一个消费者组内的不同消费者,分摊分区消费
  3. 消费者的offset会交给__consumer_offsets管理(整个集群50个)

    消费者组

  4. 消费者组分区分配

image.png

  1. 消费者组初始化

image.png

  1. 每个broker中都有一个coordinator
  2. 多个broker分摊50个__consumer_offset
  3. 通过消费者组groupid计算后,落在哪个consumer_offset,这个consumer_offset所在的broker的coordinator辅助整个消费者组的分区分配
  4. coordinator选出消费者组中的一个consumer作为leader
  5. coordinator把消费的topic情况发给consumer-leader
  6. consumer-leader负责指定消费方案
  7. consumer-leader消费方案发给coordinator
  8. coordinator下发方案到每个consumer
  9. consumer和coordinator保持心跳 3s,一旦超过消费者移除,或者消费者消费时间过长也移除
  10. 分区会重新平衡分配

  11. 消费者组详细消费流程

image.png

  • 消费者通过ConsumerNetworkClient工具拉取消息
    • Fetch.min.bytes:每次抓取大小
    • fetch.max.wait.ms:最小值未达到的超时时间
    • fetch.max:byts: 每次抓取最大
    • max.poll.records:最大条数
  • 拉取的消息通过反序列化、拦截器,最终执行数据处理逻辑

    消费者重要参数

    分区的分配和再平衡

    分区分配策略

  • Range:余数依次分配给前面几个消费者

image.png

  • RoundRobin:轮询

image.png

  • Sticky:数量上和Range分配一致,但是每个消费者的分区号不规律,是随机的
  • CooperativeRange:

    默认:Range+CooperativeRange

Offset

  1. 0.9开始会有一个记录__consumer_offset的系统自建主题,默认不可消费,可以通过exclude.internal.topics=false设置为可以消费。

自动提交

消费者每间隔一段时间自动提交offset
image.png

手动提交

消费者通过API调用提交

  • 异步
  • 同步

image.png

指定Offset消费

auto.offset.reset = earliest | latest | none 默认是 latest

  • earliest :从头开始消费
  • latest:从上次消费的offset开始消费
  • none:如果未找到消费者组的先前偏移量,则向消费者抛出异常
  • 手动指定消费位置
  • 手动指定消费时间

    漏消费和重复消费

image.png

漏消费

offset手动提交后,消费者还没消费完这批数据,woc这个不能等消费完再提交吗????

重复消费

自动提交offset会产生。A消费完成后,由于是自动提交,所以消费完成后还未来得及提交就挂了,此时再启动。offset由于未提交,会重复消费

消费者事务

消息积压

image.png

  1. 增加分区和消费者数
  2. 提高每次拉取数据大小