Web アプリケーションのバックエンドをサポートするために使用しようとしてpython-rq
いますが、新しいジョブのプッシュには非常に時間がかかります (最大 12 秒)。
enqueue_call
特にシステムに接続されているワーカー プロセスの数が増加した場合 (200 以上) 、関数呼び出しの実行時にパフォーマンス ヒットが発生します。
システムは次のように機能します。
- フロントエンドはジョブをタスク キュー サーバーにプッシュします。これは、
enqueue_call
関数を使用して、実行される関数への実際の引数に加えて、引数 (timeout や ttl など) をジョブに渡します。 - 複数のプロセス (複数のマシンに分散) がそれぞれ UNIX の下でワーカーを実行しています
screen
。ワーカーはドキュメントで提供されているパターンに従い、Worker.work()
無限ループ関数を実行してキューをリッスンします。 - 処理中、一部のタスクは、通常、実行中の同じキューで新しいタスクを生成します。
インフラストラクチャについて:
- このタスク キューを実行する Redis サーバーは専用です。また、永続性は無効になっています。4 GB の Rackspace サーバーで実行されています。
- タスク キューを使用してサーバーで実行
redis-benchmark
すると、ほとんどのベンチマークで平均 20000 r/s を超える結果が得られます。
このような状況で、新しいジョブのプッシュ パフォーマンスを改善するにはどうすればよいでしょうか? 使用すべきより良いパターンはありますか?