私はKafka Java APIを使用しており、特定のKafkaトピックからのレコードの消費に取り組んでいます。
メソッドsubscribe()
を使用して、トピックからレコードのポーリングを開始できることを理解しています。 Kafkaは、トピックの選択したパーティションからレコードのポーリングを開始する場合に、メソッドassign()
も提供します。
これが2つの唯一の違いかどうかを知りたいですか?
はい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()と同じように扱われます。
この方法によるトピックの手動割り当てでは、コンシューマーのグループ管理機能は使用されません。そのため、グループメンバーシップまたはクラスターとトピックのメタデータが変更されたときにトリガーされるリバランス操作はありません。