web-dev-qa-db-ja.com

マルチテナントキュー内の大量のメッセージを処理するための設計質問

メッセージキューを介して対話する2つのアプリケーションを持つシステムがあります。プロデューサーとコンシューマを呼びましょう。いくつかの重要なコンテキストは、これがマルチテナントなシナリオです。

プロデューサーはさまざまな入力(ユーザーのやり取り、APIなど...)に基づいてイベントを生成し、消費者はこれらのストリーム処理をダウンします。重要な制約の1つは、消費者がテナントごとに1回のイベントのみを処理できることです。

現在のソリューション(ビットナイーブ)は、複数のワーカースレッドがキューと処理イベントから引っ張っていること、およびテナントが進行中のイベントが進行中のイベントがある場合は、後でワーカースレッドが待機します。これは私達のスレッドプールおよび典型的なイベントプロダクションパターンを考えると、数年間は大丈夫ですが、私たちはプロデューサーで1つのテナントの何千ものイベントが生み出され、1つを除くすべての消費者のワーカースレッドは待っていました。したがって、消費者は一度にキューからイベントを処理し、私たちの「最終的な一貫性」の遅れ時間は最適です。

これを管理するための候補のアイデアがいくつか持っています。

  1. キュー間のロードバランシング - 新しいメッセージは最も空のキューに移動しますが、テナントは単一のキューにロックされています(これを正確にTBDを達成する方法)
  2. 「スローレーン」キューを作成する - イベントの処理中に、テナントがすでに使用されている場合は、イベントを「スローレーン」に移動します。これにより、プライマリキューがすぐにドレインされますが、イベント処理のIDEmpotencyに影響を与えます。

これらのオプションを掘り下げて他の人を探し始める前に、ここに誰かがこの種の状況を扱うためのパターンで経験がある場合は興味があります。

情報/アドバイス/ガイダンスを感謝します。ありがとう!!

5
Taylor

このアプローチは、メッセージボリュームがテナントに対して比較的安定しているシナリオにおいて実行可能であり得る。

N個のキューを作成し、5キューと言って開始し、それらのメッセージのボリュームに基づいて複数のテナントをキューに割り当てます。

例えば

500 tenants with a message volume of low       are assigned to queue 1.
200 tenants with a message volume of medium    are assigned to queue 2.
...
  5 tenants with a message volume of very high are assigned to queue 5.
 _

メッセージ配信が、各キューがテナントごとに同じ数のメッセージを平均するようなものである場合は、最終的な一貫性時間遅れを外してください。

1
hocho