2017-09-10 12 views
0

私たちは、スプリングカフカを使用してメッセージを消費しています。メッセージを受け取るために各パーティションの受信機を作成しました。今では、単一のパーティションからコンシューマメッセージに複数のレシーバが必要な要件があります。Spring Kafkaパーティション用の複数のコンシューマ

パーティション0があるとします。現在、このパーティションからメッセージを受信するレシーバ(Receiver 1)は1つだけです。 これで、同じパーティション(パーティション0)にもう1つのReceiver(Receiver 2)を追加します。

したがって、Producerが100個のメッセージをこのパーティションに送信する場合は、Receiver 1で50個のメッセージを受信し、残りの50個のメッセージをReceiver 2で受信する必要があります。両方のレシーバクラスが同じグループに属しています(私はprops.put( "group.id"、 "unique_group_id")を設定しました)

このシナリオが妥当であるかどうか理解してください。

答えて

1

いいえ、あなたはできません。です。各パーティションは、単一のコンシューマ・グループ内の1つのコンシューマのみが消費できます。

2人の消費者が同じパーティションを消費するようにするには、2人の消費者が2つの異なる消費者グループに属している必要があります。ただし、この場合、両方のコンシューマはこのパーティションのすべてのメッセージを受信します。

あなたが必要と思われるものはworker queueです。 2人のワーカーは1つのキューからメッセージを消費し、各メッセージは1人のワーカーのみが消費します。 ActiveMQ,RabbitMQなど多くのオープンソースworker queuesがあります。

+0

しかし、私たちはすでにテクノロジースタックを完成させました。だからカフカをキューに置き換えることはできない。私たちはkafkaブローカーで、コンシューマーグループに関係なくプロデューサーがメッセージのコピーを1つだけ送信するように指定することができます。 – user3811946

+0

Kafkaは、競合するコンシューマをパーティションでサポートしていません。コンシューマの並行性は、パーティションの数によって制限されます。並行性を高めるには、パーティションの数を増やすだけです。 '>最終的な技術スタック' - それは奇妙に聞こえる - それを最初に理解することなく、どのように技術を選択することができますか? –

+0

@ user3811946このような設定はありません。 Gary Russell氏は、並行性を高めるためにパーティション数を増やす必要があると述べています。別の解決策は、各消費者に対して、パーティションのデータを「ワーカー・キュー」に送り、次にこれらのメッセージを処理する複数のワーカーを持つことです。しかしながら、この解決策はより複雑である。たぶんあなたのデザインを再考する必要があります。 –

0

トピックのパーティション数を増やせない場合は、「厄介な」トリックを使用することができます。

R1  R2 
| 100  100 [X] 
| 101 [X] 101 
| 102  102 [X] 
| 103 [X] 103 
v 104  104 [X] 

これは動作しますが、いくつかの結果が生じます。このように、両方の受信機で2つ目の上のオフセット奇数でも、一つの受信機でオフセットとメッセージとpool()廃棄メッセージの後に異なる消費者グループIDを使用します。

  • 一つの受信機が死んだ/スタックしている場合、二つ目は、それが別の消費者に仕事
  • オフセット管理だ扱うことができない
  • (あなたが簡単にパーティションに別の受信機を追加することはできません)スケーラブルではありませんグループは非常に難しい(特に生産者があなたの支配下にない場合)
関連する問題