KafkaConsumer Java API Subscribe()与Assign()

时间:2018-12-26 23:13:44

标签: java apache-kafka kafka-consumer-api

我是Kafka Java API的新手,正在研究使用来自特定Kafka主题的记录。

我知道我可以使用方法subscribe()从该主题开始轮询记录。如果我要从选定主题的分区开始轮询记录,则Kafka还提供方法assign()

我想知道这是否是两者之间的唯一区别吗?

1 个答案:

答案 0 :(得分:7)

subscribe需要group.id,因为组中的每个使用者都可以通过其中一个订阅API来动态设置要订阅的主题列表。Kafka会将订阅的主题中的每个消息传递到每个消费者组一个过程。这是通过平衡使用者组中所有成员之间的分区来实现的,以便将每个分区分配给组中的一个使用者。

assign将为此用户手动分配分区列表。并且此方法不使用使用者的组管理功能(无需使用group.id

主要区别是assign(Collection)将使控制器失去动态分区分配和使用者组协调的作用

  

使用者也可以使用assign(Collection)手动分配特定的分区(类似于较早的“简单”使用者)。 在这种情况下,动态分区分配和使用者组协调将被禁用。

订阅

public void subscribe(java.util.Collection<java.lang.String> topics)

subscribe方法订阅给定的主题列表以获取动态分配的分区。并且如果给定的主题列表为空,则与unsubscribe().

相同
  

作为组管理的一部分,消费者将跟踪属于特定组的消费者列表,并且如果以下事件之一触发,则会触发重新平衡操作-

Number of partitions change for any of the subscribed list of topics
Topic is created or deleted
An existing member of the consumer group dies
A new member is added to an existing consumer group via the join API

分配

public void assign(java.util.Collection<TopicPartition> partitions)

Assign方法手动为此用户分配分区列表。如果给定的主题分区列表为空,则将其与unsubscribe()相同。

  

通过此方法进行的手动主题分配不使用使用者的组管理功能。这样,当组成员身份或群集和主题元数据发生更改时,将不会触发任何重新平衡操作。