2

APIキーによってレート制限されているWebAPIにアクセスする必要があるDjangoアプリケーションがあります。APIへのリクエストを管理するために、Django ORMでキューに入れられたタスクリクエストをポーリングし、アプリサーバーに対して非同期で実行するシンプルなバックグラウンドサーバーを作成しました(アプリサーバーは結果をブロックする必要はありません)。ワーカーサーバーは、カスタムのmanage.pyコマンドを使用して起動されます。これらの外部ルックアップの処理要件は非常に最小限であるため、メインのWebサービスから直接実行したいと思います。私はすでにその場しのぎのミューテックスでそれをリギングしているので、私のアプリケーションがスケーリングするとき、これらのワーカーサーバーの1つだけが実行されます。

アプリケーションをデプロイするときに、このワーカーサーバーを自動的に起動するための最良の方法を見つけようとしています。これをコマンドとしてsupervisord.confファイルに追加しようとしましたが、エラーで失敗しましたImportError: No module named django.core.management。これは、Djangoがインストールされている仮想環境でsupervisordが実行されていないためだと思います。そこで、postinstallフックから別のsupervisordのコピーを実行してみました。これにより、すべてのコマンドが完了するのを待ってから終了するため、展開が失敗し、postinstallタイムアウトになります。

これらのアプローチのいずれか、または機能する可能性のある別のアプローチを修正する方法はありますか?python-worker別のサービスを作成しても、同様の問題が発生するようです。

4

1 に答える 1

2

に入れることで正しい軌道に乗っていsupervisord.confます。Djangoが見つからないというエラーが発生する理由についても正しいです。幸いなことに、これは簡単に修正できます。

manage.py正しい python バイナリ (virtualenv 内のもの) を使用して django を呼び出していることを確認する必要があるだけで、問題なく動作するはずです。

正しいファイルを使用していることを確認するために完全修飾パスを使用する例を次に示します。アプリの名前も である場合を除き、manage.py へのパスは異なる可能性が高く、 をカスタム コマンドの名前にmyapp変更する必要があります。my_awesome_command

[program:custom_command]
directory = /home/dotcloud/current/
command = /home/dotcloud/env/bin/python /home/dotcloud/current/myapp/manage.py my_awesome_command
stderr_logfile = /var/log/supervisor/%(program_name)s_error.log
stdout_logfile = /var/log/supervisor/%(program_name)s.log
于 2012-11-01T13:30:09.150 に答える