私は巨大な django プロジェクトを持っており、Instagram API とそのサブスクリプション モデルを使用して動作させる必要があります。サブスクリプションの場合、サーバーは非常に応答性が高く、ユーザーが投稿したときに通知を受け取るようにフックを設定するために非同期で動作する準備ができている必要があります。または、それがドキュメントが示唆していることです。そこでトルネードを使うのは良いことでしょうか?その小さな部分だけですか、それとも Django を効果的に使用できますか? もしそうなら、どのように?
3 に答える
Tornado上でWSGIコンテナーを使用して、Djangoを含む任意のWSGIアプリケーションをホストできますが、その場合、WSGIアプリケーションは引き続きブロッキングアプリケーションとして実行され、魔法のように非同期アプリケーションとして実行されることはありません。したがって、Djangoがリクエストを処理しているとき、Django内で同時に別のリクエストを処理することはできません。その時点での解決策は、シングルスレッドのWSGIサーバーを実行することと大差ありません。同時リクエストを処理するには、複数のTornadoインスタンスが必要になります。
つまり、すべては実際には非同期の意味に依存します。確かに、DjangoでTornadoの直接非同期プログラミングAPIを利用することはできません。したがって、WSGIインターフェイスを介してDjangoでTornadoを使用しても、大きなメリットはありません。
私が理解しているように、あなたはInstagramのドキュメントでこの段落について話している
ペイロードごとに複数の更新オブジェクトを受け入れるようにシステムを構築する必要がありますが、多くの場合、含まれているのは 1 つだけです。また、2 秒のタイムアウト内に POST を確認する必要があります。受信した情報をさらに処理する必要がある場合は、非同期タスクで行うことができます。
これは、Tornado が提供する別のタイプの「非同期」です。これには Django + Celeryの方が適していると思います。
アプリケーションは次のように動作します。
- Instagram から JSON データを受け取ります
instagram_process.delay(request.raw_post_data)
たとえば、またはinstagram_process.delay(request.body)
Djangoのバージョンに従って、セロリタスクを作成します- ステータス コード 200 を含む Instagram への応答
- タスクでは
instagram_process
、すべてのプロセスを実行します-JSON を解析し、データベースに保存し、その他必要なことを行います。
確認したい場合X-Hub-Signature
は、手順 1 と 2 の間で確認するか、このヘッダーをタスクに渡して手順 4 で署名を検証します。
tornado.wsgi を使用して、Tornado を他の WSGI 準拠のフレームワークと統合できます。詳細については、このデモ プロジェクトをご覧ください。