Kafka多进程消费

2018/11/23 Java

高效使用Kafka必须面对多线程还是多进程消费的问题。

消费者群组

消费者可以通过使用同一个group.id加入一个组。

  • 一个组的最大并行度是该组中的消费者的数量 ← 分区的数量。

  • Kafka将一个主题的分区分配给组中的使用者,以便每个分区仅由组中的一位消费者使用。

  • Kafka保证只有群组中的单个消费者阅读消息。

  • 消费者可以按照存储在日志中的顺序查看消息。

  • Kafka Consumer不是线程安全的,不允许一个partition被多个consumer同时消费。

这篇文章介绍如何多进程消费kafka,核心思想如下:

如果任何消费者或经纪商未能向ZooKeeper发送心跳,则可以通过Kafka集群重新配置它。 在这种重新平衡期间,Kafka会将可用分区分配给可用线程,可能会将分区移至另一个进程。

也就是说,当一个进程挂掉或者加入的时候,ZooKeeper会自动分发资源,保证所有进程合理化消费Kafka。

代码链接

具体操作可以参考Readme.md

操作步骤

  • 本机启动zookeeper , kafka,创建多个partition的topic
  • 执行KafkaApplicationTests.java,kafka会默认随机到不同partition进行操作
  • 本机多次启动ConsumerTest,观察日志输出 producer
  • 启动单个进程 consumer1
  • 启动两个进程 consumer2
  • 启动四个进程 consumer3 consumer4 consumer5 consumer6

同样,强制杀掉某个进程,那个进程绑定的partiton会被别的活跃进程监听。

参考文章

Kafka消费者群组示例

Search

    Table of Contents