0

ときどき、セロリ ワーカーが RabbitMQ への接続を「失う」ことがあります。ログを調べたところ、セロリのログには何も表示されませんが、RabbitMQ のログには表示されます。

=WARNING REPORT==== 2-Jan-2013::09:13:04 === 1.1.1.1:43760 からの TCP 接続 <0.14032.9> での例外 connection_closed_abruptly

私のセットアップはとてもシンプルです。1 つのサーバーでセロリ ワーカーを実行し、別のサーバーで RabbitMQ キューを実行しています。ワーカーはリモートでキューに接続します。

サーバーをRabbitMQサーバーで再起動すると、セロリワーカーも手動で再起動する必要があることに気付きました。

4

1 に答える 1

0

これは、私が使用していた init スクリプトの問題のようです。セロリ デーモン プロセスに SIG TERM シグナルを送信しても、ワーカーは強制終了されません。メディエーターがタスクをプールにフィードするのを待つ状態でワーカーを維持しますが、SIG TERM はメディエーターを強制終了します。

以下で見つけたデバッグステートメントを見てください。

    [2013-01-02 16:23:58,624: DEBUG/MainProcess] Terminating celery.worker.consumer.Consumer...
    [2013-01-02 16:23:58,624: DEBUG/MainProcess] consumer: Stopping consumers...
    [2013-01-02 16:23:58,625: DEBUG/MainProcess] Terminating celery.worker.mediator.Mediator...
    [2013-01-02 16:23:59,034: DEBUG/MainProcess] Terminating celery.concurrency.processes.TaskPool...
    [2013-01-02 16:23:59,050: DEBUG/MainProcess] Terminating celery.worker.hub.Hub...
    [2013-01-02 16:23:59,050: DEBUG/MainProcess] consumer: Closing consumer channel...
    [2013-01-02 16:23:59,051: DEBUG/MainProcess] consumer: Closing broadcast channel...

回避策は、SIG TERM シグナルをすべてのワーカー プロセスにも送信することです。

    if [ $(ps aux | grep -c 'celery') -eq 1 ] ; then
            ps auxww | grep celeryd | grep -v "grep" | awk '{print $2}' | sudo xargs kill -HUP
    fi

これは、jenkins ビルド スクリプトが実行されるたびに (ポスト コミットごとに) 偶然にも起こりました。

于 2013-01-03T17:24:00.893 に答える