作成直後に作業を実行しているワーカーの間に、wierd mysqlの問題に取り組んでいます。セロリのワーカーごとに別々のデータベース接続を作成する
我々はこれまでのところで、時に労働者の処理開始、それらはすべて同じMySQLを取得する同時実行3. マイobeservationとセロリプロセスを開始ジャンゴ1.3、セロリ3.1.17、djorm-EXT-プール0.5を使用
接続。以下のようにdb接続IDをログに記録します。
from django.db import connection
connection.cursor()
logger.info("Task %s processing with db connection %s", str(task_id), str(connection.connection.thread_id()))
すべてのワーカーがタスクを取得すると、最初のタスクは正常に実行されますが、残りの2つは奇妙なMysqlエラーが発生します。それは、 "MySQLのサーバーがなくなった"エラー、またはDjangoが "DoesNotExist"エラーをスローする状態のいずれかです。 Djangoが照会しているオブジェクトは明らかに存在します。
このエラーが発生すると、各ワーカーは独自のデータベース接続を開始したが、問題が見つからない。
セロリのデフォルトの動作は何ですか?同じデータベース接続を共有するように設計されていますか?もしそうなら、プロセス間通信はどのように扱われますか? 私は理想的には、各作業者ごとに異なるデータベース接続を推奨します。
下のリンクで動作しないコードを試しましたが、 Celery Worker Database Connection Pooling
また、以下で提案するセロリコードを修正しました。 https://github.com/celery/celery/issues/2453
質問を下す人のために、私にdownvoteの理由を教えてください。
Django接続プーリングミドルウェアを使用していますか?また、あなたの 'CONN_MAX_AGE'はdjangoの設定で何ですか?私はこれがdjangoで永続的な接続動作に影響すると思います。これは、あなたが見ている動作に関連している可能性があります。セロリ自体には関係しません。 –
並行性= 1を実行して複数のワーカーを起動できますか? –
@AlexLuisAriasこれは、1つのワーカープロセスだけを実行し、上記の問題のケースではありません。 –