カフカのアプリケーションは、トピックをサブスクライブし、サブスクライブトピックからメッセージを受信するためにKafkaConsumerを使用しています。
消費者や消費者団体
コンシューマオブジェクトは、トピックをサブスクライブし、メッセージを受信し、そのメッセージを検証し、結果を保存するために使用されます。
コンシューマ・グループに属するカフカの消費者。消費者のグループは、同じテーマにサブスクライブする場合、各消費者は、パーティションのメッセージの件名部分を受信します。
消費者の数のコンシューマ・グループは、パーティションのテーマの数よりも大きい場合、消費者のアイドル部分があるだろう、それはすべてのメッセージを受信しません。
新しいコンシューマ・グループを追加する場合、それは元のメッセージは、他の消費者が読むことを読み取ります。消費者がシャットダウンまたはクラッシュした場合、それはグループを残して、元のパーティションは、その選択した他の消費者のグループによって読み込まれます。
スケール支出電源への主要な方法で、コンシューマ・グループを増やします。
私たちは、負荷の増加は、より多くの消費者に追加することができ、パーティションのテーマを大量に作成する必要があります。
従来のメッセージングシステムとは異なり、スケールカフカの消費者や消費者団体は、パフォーマンスに悪影響を与えません。
パーティションのリバランス
パーティションの所有権は別のコンシューマ1人の消費者から転送され、このような現象は、リバランスとして知られています。
リバランスは、コンシューマ・グループの高可用性と拡張性をもたらします。
通常の状況下で、我々はそのような行動を発生する必要はありません。
リバランス時には、消費者たちは、グループ全体に短い時間を使用することはできませんメッセージを読み取ることができません。また、パーティションが別の消費者に再割り当てされたときに、消費者が現在の状態が失われて読み取るために、それはまた、状態は、アプリケーションが遅くなります再開する前にキャッシュをフラッシュする必要があるかもしれません。
消費者がグループコーディネータブローカによって割り当てられる(異なるグループが異なるコーディネータを有していてもよい)、それらのグループ提携とパーティションの所有権を維持するためにハートビートを送信します。
限り、消費者が通常時のハートビート間隔を送って、それがパーティションはニュースでそれを読んでいることを示す、有効であると考えられました。
消費者は、(メッセージを得るために)ポーリングにハートビート・メッセージを送信する場合、またはオフセットに出願されてもよいです。
消費者が十分な長さのハートビートの送信を停止した場合、セッションの有効期限が切れ、グループのコーディネーターが、それは死んだと思う、それはリバランスがトリガされます。
消費者がクラッシュした場合、およびメッセージの読み取りを停止、グループのコーディネーターは、リバランスの死をトリガーすることを確認するために、数秒待ちます。
消費者をクリーンアップすると、消費者はコーディネータがグループから脱退する必要があります通知されます、コーディネータはすぐに処理が一時停止を最小限にするために再バランスをトリガします。
メッセージには、長い処理時間を取る必要がある場合、市場価値max.poll.interval.msポーリング間隔を長くするために増加させることができます。
パーティションの割り当て
消費者がグループに参加したい場合は、JoinGroupグループコーディネーターのような要求を送信します。消費者のグループに参加する最初の主要なグループになります。
そこコーディネータからグループのメンバーのリストを取得するメイングループ、および各消費者のパーティションに配布する責任があります。それは、消費者に割り当てされるべきパーティションを決定するために、インタフェースPartitionAssignorを実装するクラスを使用します。
カフカは、2アロケーション戦略を構築しました。配布が完了した後、グループのコーディネーターに送信されたリストの配布のメイングループ、コーディネータは、すべての消費者にメッセージを送信します。
各消費者は唯一、自分の割り当て情報を見ることができ、グループ内で唯一の主要なグループは、すべての消費者のための割り当て情報を知っています。
このプロセスは、それが再バランスされるたびに繰り返されます。
投票
コア消費者のポーリングメッセージのAPIは、単純なポーリングを介してサーバにデータを要求します。
消費者が話題に加入すると、ポーリングは、データにハートビートとアクセスを送って、リバランスをゾーニング、調整グループを含む、すべての詳細を、処理します。
消費者は、そうでない場合は、彼らが死んだと見なされます、カフカの世論調査(アンケート)を続けなければなりません。
世論調査は、()メソッドは、レコードのリストを返します。各レコードは、レコードの情報はテーマに属しているが含まれ、パーティション情報は、記録された記録キーは、パーティション内のオフセット、および右記録されます。
消費者を閉じるには、アプリケーション()メソッドの打ち上げ前に、近くに使用します。Fiとsockerはそれが一度にグループ全体で、その結果、長い時間がかかるので、それはもはやハートビートを送信することを見つけないと、それは死んだ見つけもシャットダウンして、すぐにバランスの取れ再びトリガではなく、グループのコーディネーターを待っています内部のメッセージを読み取ることができません。
ポーリングは、一度最初の()メソッドでは、新たな消費者の投票を呼び出し、それがグループに参加、その後、GroupCoordinatorを探しを担当する、データを取得するのと同じくらい簡単ではありませんが、割り当てられたパーティションを受け入れました。
これが再び均衡発生した場合、全体のプロセスは、ポーリング中に行われます。もちろん、ハートビートが内部ポーリングから送り出されます。
同グループでは、我々は消費者が複数のスレッドを実行できるようにすることはできません、複数のスレッドは、消費者が安全に共有できるようにすることはできません。
原則として、消費者は郡を使用します。
あなたは同じコンシューマ・グループに複数の顧客を実行したい場合は、我々は独自のスレッド内のすべての消費者が実行するようにする必要があります。
独自のオブジェクトにカプセル化され、消費者のロジックに優れている、その後、すべての消費者が独自のスレッド上で実行されるように、Javaスレッド・プールには、複数のスレッドを開始します。
消費者の設定
bootstrap.servers
group.id
key.deserializer
value.deserializer
fetch.min.bytes
fetch.max.wait.ms
max.partition.fetch.bytes
session.timeout.ms
auto.offset.reset
enable.auto.commit
partition.assignmeng.strategy
クライアントID
max.poll.records
receive.buffer.bytes
send.buffer.bytes
提出とオフセット