0

私は数千人のユーザーを持つアプリケーションを持っています。各ユーザーは、10 ~ 100 のジョブをキューに入れることができます。ワーカー (~10) が 10 個のジョブ (同じユーザーからのものである可能性があります) ではなく、10 人の異なるユーザーの 10 個のジョブを処理したくありません。

user1
    job1
    job2
    job3
    job4
    job5
user2
    job6
    job7
    job8
user3
    job9
    job10
    ...

したがって、上記の例では、ワーカーが次の順序で処理するようにします。

worker1 -> job1, job2, job3
worker2 -> job6, ...
worker3 -> job9, ...
...

これをbeanstalkd(推奨)またはgearmanで簡単に実装する方法はありますか?

4

1 に答える 1

0

この場合、チューブ機能を使用できると思います。

あなたが持つことができます
  • 各ユーザーのチューブ (user1、user2、user3、...)
  • コントローラーチューブ
次に、ステップは次のようになります

ジョブ プロデューサー:

  1. ユーザーのチューブにジョブを追加します。
  2. コントローラーチューブに挿入したばかりのチューブの名前を追加します。

仕事の労働者:

  1. コントローラーチューブへの予約(タイムアウトなし)
  2. コントローラーチューブからジョブを取得しました
  3. TIMED_OUT になるまで、reserve-with-timeout(with timeout = 0) をユーザーのチューブにループします
  4. 1からやり直す。

reverseこれは新しく予約されたジョブを返します。予約できるジョブがない場合、beanstalkd は、ジョブが使用可能になるまで応答の送信を待ちます。

reverse-with-timeout タイムアウト値が 0 の場合、サーバーはすぐに応答または TIMED_OUT を返します。タイムアウトの正の値は、ジョブが利用可能になるまでクライアントが予約要求をブロックする時間を制限します。

参照ドキュメント

于 2013-11-21T15:24:07.623 に答える