書く方法Kafka consumer-シングルスレッドとマルチスレッド
私は単一のKafkaコンシューマー(Spring Kafkaを使用)を作成しました。単一のトピックから読み取り、コンシューマーグループの一部です。メッセージが消費されると、すべてのダウンストリーム操作を実行します。次のメッセージオフセットに進みます。これをWARファイルとしてパッケージ化し、展開パイプラインがこれを単一のインスタンスにプッシュします。展開パイプラインを使用して、このアーティファクトを展開プール内の複数のインスタンスに展開できます。
ただし、インフラストラクチャの一部として複数のコンシューマーが必要な場合、次のことを理解できません。
実際に展開プールで複数のインスタンスを定義し、それらすべてのインスタンスでこのWARを実行できます。これは、それらすべてが同じトピックを聞いており、同じ消費者グループの一部であり、実際にパーティションを分割することを意味します。ダウンストリームロジックはそのまま機能します。これは私のユースケースでは完全に機能しますが、これが最適なアプローチであるかどうかはわかりません。
オンラインで読むと、リソース here および here に出くわしました。ここでは、1つのコンシューマスレッドを定義していますが、内部的には複数のワーカースレッドを作成しています。また、ダウンストリームロジックを実行する複数のコンシューマスレッドを定義できる例もあります。これらのアプローチを検討し、それらを展開環境にマッピングすると、同じ結果を得ることができました(上記の理論上のソリューションと同じ)が、マシンの数は少なくなりました。
個人的には、私のソリューションはシンプルでスケーラブルですが、最適ではないかもしれませんが、2番目のアプローチは最適かもしれませんが、あなたの経験、提案、または考慮すべき他のメトリック/制約を知りたいですか?また、理論的な解決策を考えています。実際にKafka=消費者として単純なマシンを使用することができます。
私は知っていますが、コードを投稿していません。この質問を別のフォーラムに移動する必要がある場合はお知らせください。特定のコード例が必要な場合は、それらも提供できますが、私の質問の文脈では、それらが重要だとは思いませんでした。
既存のソリューションが最適です。別のスレッドにハンドオフすると、オフセット管理に問題が発生します。 Spring kafkaでは、十分なパーティションがある限り、各インスタンスで複数のスレッドを実行できます。
現在のアプローチが機能する場合は、それに固執するだけです。シンプルでエレガントな方法です。
何らかの理由でパーティション数を増やすことができないが、より高いレベルの並列処理が必要な場合にのみ、アプローチ2に進みます。しかし、その後、心配する順序と競合状態があります。そのルートに行く必要がある場合は、 akka-stream-kafka ライブラリをお勧めします。元の順序を保持する単一のストリームなどです。そうしないと、これらのことはエラーを起こしやすくなります。