2017-11-05 13 views
0

新しいプロジェクトでは、RabbitMQまたはKafkaと一緒にMicroservicesを使用しています。私は両方の技術について同じ質問がありますが、答えは異なるかもしれません。 マイクロサービスで並列コンシューマをスケールアップする方法

は、3つのイベントを検討し

  1. を製品1
  2. を作成して1

私たちは、サービス間のデータを "複製" するために、これらのイベントを使用するプロファイル1

  • 削除製品を作成します。 1つのコンシューマを使用すると、すべてのメッセージが正しい順序で実行され、データベースの一貫性が保たれます。

    ただし、この1人の消費者がメッセージの処理を遅くすると、別の消費者を並行して追加することができます。この時点では、イベント1がイベント3より前に実行されていて、不整合なデータベース(最初に削除する、後に作成する)が発生する可能性があることは不確実です。

    被験者についていくつかの情報hereが見つかりましたが、どちらの解決策も実装が難しいようです。これらの消費者をどのように拡大することが可能でしょうか? RabbitMQまたはKafkaを使用してこれを処理する方法に違いはありますか?

  • 答えて

    2

    カフカベースの実装では、同じ「論理グループ」(id?)に属するすべてのイベントが同じパーティションに着くようにするだけで済みます。この場合は、より多くのコンシューマを追加できますパーティション)を使用して並列にイベントを処理しますが、すべてのコンシューマは論理グループのイベントのみを処理します。

    正しいキー/パーティション化手法を選択することで、IDをキーとして使用するか、より洗練されたパーティション化の実装を選択できます。

    +1

    これを拡張するには、独自のpartionerクラス(https://kafka.apache.org/0110/javadoc/org/apache/kafka/clients/producer/Partitioner.html)を実装する必要があります。 Kafkaで独自のパーティションキーを処理することで、問題が発生しました。どのような "論理グループ"が他のパーティションよりもはるかにボリュームが大きい場合、そのパーティションは他のパーティションよりもスケーラビリティが高くなり、同じトピックの一部を維持するために特別な保守が必要になる可能性があります。 –

    +0

    RabbitMQでは、並行して処理できるメッセージ用のキューを作成するだけです – JDel

    関連する問題