【Kafka】Kafka消費者グループsubscribeとassignの正しい使用

2125 ワード

Apache Kafka消費者グループを使用する場合、消費者に対応するパーティションpartitionを割り当てるプロセスがあり、「自動」subscribeと「手動」assignの方法を使用することができます.
「自動」と「手動」を同時に行うパーティション割り当ては、互いに影響し合い、事態を悪化させることがあります.正しく使うには、まずこの2つの方法のシーンを理解しなければなりません.
コンシューマグループの使用シーン
Kafkaの消費者グループには2つのシーンがあります.
  • 「キュー・モード」:同じグループの消費者が1つのトピックのすべてのメッセージを共同で消費し、1つのメッセージが1つの消費者によってのみ処理されることを確保します.1つのトピックのすべてのパーティションは、1つの消費者グループのすべての消費者に関連付けられます.各消費者は、1~複数のパーティションに関連付けられ、メッセージを受信します.逆に言えば、1つのパーティションは1つの消費者にのみ関連し、そのメッセージは他の消費者に受信されません.最初に1人の消費者しかいなかったとき、すべてのパーティションが割り当てられました.メッセージの規模が増加すると、消費者の数を拡大し、処理能力をレベル的に拡張し、消費者ごとに1つのパーティションだけを関連付けることができます.パーティション数より大きい消費者は、パーティションが割り当てられていないため、空き状態になります.
  • 「パブリッシュ/サブスクリプションモード」は、異なる消費者グループを作成し、トピックのメッセージがすべての消費者グループに送信され、消費者グループが前に共同で協力したシーンに従って割り当てられることを意味します.これは往々にして私たちが異なる応用需要を持っているためで、例えば取引データ、資金システム、ERPシステムはそれを消費し、リスク監視も同時に消費する必要があります.これにより、データの透明な非同期共用が実現される.2つのシーンでは、消費者グループには重要な機能があります.rebalancingです.新しい消費者がグループに追加されると、有効なパーティション(消費者数<=トピックパーティション数)がある場合、再均衡配分の操作が開始され、関連付けられたパーティション(元の消費者が少なくとも1つのパーティションを保持している)が新たに追加された消費者に再配分されます.同様に、消費者が様々な理由でこのグループを離れると、そのすべてのパーティションは残りの消費者に割り当てられます.

  • 「自動」OR「手動」
    前述の自動割当てとは、KafkaConsumer APIにおけるsubscribe()メソッドを指す.この方法は消費者のために消費者グループを設定することを強制します.idパラメータは空にできません.パーティションの割り当ての問題を処理する必要はありません.subscribe()メソッドに対応して、消費者がどのトピックパーティションを読み込むかを手動で指定することができます.assign()メソッドです.この手動では、メッセージ処理の負荷を正確に制御し、どのパーティションにどのメッセージがあるかを決定する必要がある場合に便利です.しかしこの時Kafkaもrebalancingの機能を提供できなくなった.また、手動で使用する場合は、消費者グループを指定しなくてもいいです.idが空です.どちらの方法にも適用シーンがありますが、同時に2つの方法を併用することをお勧めしません.これはリスクをもたらします.1つの消費者グループG 1を仮定すると、グループ内には1つの消費者C 1しかなく、subscribeは2つのパーティションP 1,P 2を有するトピックT 1を購読する.このときG 1に消費者C 2が追加され、P 1とP 2がassignで関連付けられる.すべては可能だが、実は悪い状況だ.本質的には、使用シーンが混同されており、G 1が共同で協力しているのか、配布/購読しているのかは判断できません.実際の使用ではoffsetのコミットフォーマットは次のとおりです.
        key = [group, topic, partition]
        value = offset
    

    注意Keyには消費者が区別されておらず、C 1とC 2は同じキーに対して汚れて書きます.C 1またはC 2がクラッシュして再起動すると、上書きされたoffsetが相手に渡され、メッセージが失われる可能性があります.
    まとめ
    subscribe()メソッドを使用して、パーティションを自動的に割り当てることが望ましい.結局、Kafkaの消費者グループのメカニズムはすでに優秀で、私たちのために多くの工夫を節約しました.assign()で指定する必要があっても、対応する消費者グループを設定する必要があります.できるだけ混ぜて使わないでください.