web-dev-qa-db-ja.com

KafkaConsumer Java API subscribe()とassign()

私はKafka Java APIを使用しており、特定のKafkaトピックからのレコードの消費に取り組んでいます。

メソッドsubscribe()を使用して、トピックからレコードのポーリングを開始できることを理解しています。 Kafkaは、トピックの選択したパーティションからレコードのポーリングを開始する場合に、メソッドassign()も提供します。

これが2つの唯一の違いかどうかを知りたいですか?

10
Karan Khanna

はいsubscribe必要_group.id_グループ内の各コンシューマはサブスクライブメソッドで提供されるトピックのリストのパーティションに動的に割り当てられ、各パーティションはそのグループ内の1つのコンシューマスレッドで使用できるため。これは、コンシューマーグループ内のすべてのメンバー間でパーティションのバランスを取り、各パーティションがグループ内の1つのコンシューマーに割り当てられるようにすることで実現されます。

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()と同じように扱われます。

この方法によるトピックの手動割り当てでは、コンシューマーのグループ管理機能は使用されません。そのため、グループメンバーシップまたはクラスターとトピックのメタデータが変更されたときにトリガーされるリバランス操作はありません。

14
Deadpool