2017-12-27 21 views
1

更新:要するにJavaのネストされたキュー

、私はサービスへのユーザーからメッセージを送信キューを持っています。 しかし、1つのサービスが1000sのメッセージを受け取ると、キューは によって支配され、それ以外のサービスはキューが空になるまでメッセージを受信しません。私はこれを解決するために のアプローチが必要です。

BlockingQueue'sに問題があります。私はそれらにメッセージを配信する責任がある100の外部サービスがユーザーから来ると言います。

ユーザー - >私 - >第三者。

私のアプリケーションにキューを使用しています。第三者サービスの1つが利用できない場合に問題が発生します。

  • ユーザーからの第三者へのメッセージが届きました。同じキューに保存してQ1と言うことができます。
  • キューを消費し、サードパーティサービスを識別し、それを対応するサードパーティに送信します。
  • サードパーティのいずれかが応答しない、タイムアウトしました。
  • DBに配信できないメッセージを保存します。
  • DBから定期的に配信されないメッセージを取得してQ1に入れます。
  • そのサードパーティが多くのトラフィックを受け取った場合、このキューが空になるまで他のサービス以外のものが私からメッセージを受け取るよりも、自分のキューを満たしている5000個のメッセージを伝えることができます。しかし、このキューが空の場合、私はDBからメッセージを再度取得してキューに入れ、他のサービスは再びブロックされるため、メッセージを受け取ることはありません。私は、これまで考え

Solutiouns:サービスIDのことで、ネストされたキューを使用して

  • を、ので、私は一度にブロックされたサービス5000件のメッセージを識別し、5000倍せずにDBに保存されますがかもしれない(キューからメッセージを消費します

(私はBlockingQueueを使用しています)ネストされた並行キューを効率的に使用するか、このシナリオに対するよりよい解決策を考えていますか?基本的に私はダウンしている第三者に私のキューを支配させたくありません。そして、私はそれらのキューを分離する巧妙な方法が必要です、それらの数千人がいるかもしれないので、それぞれのキューを作成することは非効率的かもしれません。

+0

RxJavaのような反応的なフレームワークを使用したことはありますか? –

+0

何とか時間切れになったものにマークを付けることができます。また、時間のかかる待ち行列に戻すことはできません。あなたが5秒後に初めて戻すだけで、2回目は10回、次に20回、40回、1分間、2分間などとなります。あなたはその考えを得る。システムがアイドル状態にならないようにするには、キューが空の場合は上記を無視してください。 –

+0

私はRxJavaを最初に研究しなければなりません。提案に感謝します。私は既にサービスの新しいメッセージよりもX個のメッセージがタイムアウトした場合のように動作するタイムアウトマップを持っています.YはキューではなくDBに書き込まれ、Z回ブロックされます。新しいメッセージがZ + 1回までブロックされていない場合はZ時間後にまだブロックされています。しかし、反対側では、このサービスはDBで処理待ちのメッセージをたくさん取得します。これらのメッセージが処理されるDBから取得されると、キューが再びブロックされます。 – cmlonder

答えて

0

サードパーティのすべてのサービスのメッセージを保持する1つのBlockingQueueを使用しているようです。

代わりに、

  • 使用はあなたがユーザーからのメッセージを取得すると、代わりにキューに追加するので、そこにサードパーティのサービスを識別し、各サードパーティのサービス
  • のためにキューおよびキューの消費者をブロック分けそれに応じてサードパーティのサービス固有のブロッキングキューにメッセージを追加します。
関連する問題