2

Celery を使用してタスク キューを実装し、外部 API (SMS 送信用の Twilio など) とのやり取りなど、長時間実行される (っぽい) タスクを実行したいと考えています。ただし、本番環境と開発環境では異なる API 資格情報を使用しています。

Celery を静的に (コマンドラインから) 構成して、適切な API 資格情報を渡す方法がわかりません。関連して、アプリケーション コード (Celery タスクを起動する) は、開発キューと運用キューの両方がある場合、通信する Celery キューをどのように指定しますか?

ご協力いただきありがとうございます。アビ

編集: セロリの --config オプションを使用する方法の実例の追加ボーナス。

4

2 に答える 2

3

私がそれを行う方法は、環境変数を使用することです。簡単な例として...

# By convention, my configuration files are in a "configs/XXX.ini" file, with
# XXX being the configuration name (e.g., "staging.ini")
config_filename = os.path.join('configs', os.environ['CELERY_CONFIG'] + '.ini')
configuration = read_config_file(config_filename)

# Now you can create the Celery object using your configuration...
celery = Celery('mymodule', broker=configuration['CELERY_BROKER_URL'])

@celery.task
def add_stuff(x, y):
    ....

あなたはそのようにコマンドラインから実行することになります...

export CELERY_CONFIG=staging
celery -A mymodule worker

この質問には、このようなことをする例がありますが、「どうすればそれほど醜くない方法でこれを行うことができますか?」と言われます。私に関する限り、これは許容範囲内であり、「醜い」ものではありません。

于 2013-06-20T17:44:36.850 に答える
0

12 要素アプリによると、コマンド ライン パラメーターの代わりに環境変数を使用する必要があります。

これは、アクセス資格情報などの機密情報を使用している場合に特に当てはまります。それらはps出力に表示されるためです。機密情報をVCSに保存しないようにする必要があるため、もう 1 つのアイデア (構成ファイルに資格情報を保存する) は理想とはほど遠いものです。

そのため、多くのコンテナー サービスと PaaS プロバイダーは、より簡単なインストルメンテーションと自動化されたデプロイというこのアプローチを好んでいます。

Python Deployment Anti-patternsをご覧になることをお勧めします。

于 2013-06-20T17:45:53.687 に答える