0

私の Producer application.properties には、

spring.cloud.stream.bindings.output.producer.partitionKeyExpression=payload
spring.cloud.stream.bindings.output.producer.partitionCount=4

そして、私のコンシューマーapplication.propertiesは次のようになります

spring.cloud.stream.bindings.input.consumer.partitioned=true
spring.cloud.stream.bindings.input.group=group01

アプリを Pivotal Cloud Foundry にデプロイし、アプリを 2 つのインスタンスにスケーリングすると、2 つのキューが作成されることがわかります。それらは、接尾辞 -0 および -1 で交換にバインドされます。

ただし、これは、メッセージに -3 または -4 で終わるトピックが含まれている場合、それらのトピックにはバインディングが存在しないため、メッセージが失われることを意味します。コンシューマーを 4 つのインスタンスにスケーリングすると、期待どおりに動作します。

私の質問は、コンシューマー インスタンスをプロデューサーの partitionCount より少なくすることはできないのでしょうか? この場合、1 つまたは複数のキューに、交換への複数のバインディングがあります。

4

2 に答える 2

1

これは、デフォルトでパーティション化されたメディアではない RabbitMQ の場合です。各パーティションは 1 つのインスタンス/キューに対応します。Kafka では、コンシューマごとに複数のパーティションをサポートしています (したがって、トピックはアプリケーションの複数のインスタンスで共有されます)。私たちは、RabbitMQ で同様のものをサポートすることを検討していますが、その特定のケースでの難点は、合計でいくつのパーティションがあるかを知るのが容易ではないことです (エラーが発生しやすいトピックを調べることを除いて)。

于 2016-08-18T00:34:59.207 に答える
-1

いいえ。消費者インスタンスの番号と一致する必要はありません。トピック内のパーティションの数:

  1. いいえ。コンシューマーの数がパーティションよりも少ない場合、一部のコンシューマー インスタンスが複数のパーティションからデータを取得し始めます。
  2. いいえ。コンシューマーの数がパーティションよりも大きい場合、一部のコンシューマー インスタンスはデータを受信しません。アイドル状態のままになります。
于 2016-08-19T05:05:32.690 に答える