3

私はrabbitmqとceleryを使用してセットアップを行い、ワーカーはそれぞれ4つのインスタンスを持つ4つのマシンで実行しています。基本的に同じバックエンド関数を呼び出す2つのタスク関数が定義されていますが、そのうちの1つはprocess_transactionrate_limitが定義されていない名前で、もう1つは。で呼び出されslow_process_transactionていrate_limit="6/m"ます。タスクはrabbitmqの異なるキューに移動しslowますnormal

奇妙なことに、両方のタスクにrate_limitが適用されています。celery.control.rate_limitを使用してrate_limitを変更しようとしても、process_transactionで変更しても実効レートは変更されず、slow_process_transaction名前を使用すると両方の実効レートが変更されます。

何が悪いのかについて何か考えはありますか?

4

1 に答える 1

8

バケットのソースコードを読むことで、セロリはタスクの終了後に時間デルタをスリープすることでレート制限を実装していることがわかりました。したがって、同じワーカーで異なるレート制限のタスクを混在させると、それらは互いに影響し合います。

労働者を分離することで私の問題は解決しましたが、それは最適な解決策ではありません。

celeryd呼び出しでノード名と名前付きパラメーターを使用して、ワーカーを分離できます。たとえば、ノード「fast」と「slow」があり、それぞれ同時実行性が5と1の別々のキューを消費するようにします。

celeryd <other opts> -Q:fast fast_queue -c:fast 5 -Q:slow slow_queue -c:slow 1
于 2012-12-26T15:41:09.193 に答える