1

私は次のシナリオを持っています:

  • いくつかの操作が呼び出され、その結果、複数のタスクが作成されます(数千)
  • それら(それらのステータスと詳細)はデータベーステーブルに保存されます
  • どういうわけか、これらのタスクを複数のノードで実行する必要があります

したがって、明らかな方法は、作成されたタスクごとにJMSメッセージ(10000タスク-10000メッセージ)を送信し、コンシューマーのプール(ノードごと)がそれらを実行することです-しかし、これはやり過ぎのように見えます-リスナーはタスクをフェッチする必要がありますとにかくDBから、次のタスクを実行する必要があることを通知するだけで十分です。まるで-1つのメッセージを送信し(「次のタスクを実行」)、どういうわけか10000回配信されるように設定します。

これにアプローチする方法は?10000通のメッセージを送信するのが本当に最善のアイデアですか?

また、ActiveMQにはこのメッセージスケジューリング機能があります[1]-おそらく、期間を0に設定し、10000に繰り返すだけですか?それは正しく機能しますか?上記以外の良い方法はありますか?

[1] http://activemq.apache.org/delay-and-schedule-message-delivery.html

4

1 に答える 1

0

実際、完了したタスク (1..n) の ID を格納するために Redis を使用できます。そして、「セット」データ構造を使用します。

キーはタスクリストのようになります:

各キーには、完了したタスクの ID が含まれます。

したがって、1000 の非同期タスクでジョブを開始したとき。このジョブの一意の ID を生成し、タスク ID と共に送信します。タスクが完了すると、ワーカー (このタスクを処理する人) はこの ID を DB (Redis) に追加する必要があります。そして、最後のワーカーが ID を DB に保存し、同じサイズのタスクのサイズが設定されたとき (各タスクの後に確認する必要があります) — すべてのタスクが完了したので、別のメッセージを送信したり、他の何かを作成したりできます。

Redis は非常に高速なアクセスと非常に高速な少数のデータ構造を提供します。

于 2013-03-26T09:21:00.220 に答える