現在、apache/mod_wsgi によって提供され、AWS ELB ロード バランサーの背後にある複数の AWS EC2 インスタンスにデプロイされている、非常に複雑な Django アプリケーションがあります。クライアント アプリケーションは、AJAX を使用してサーバーと対話します。また、サーバーを定期的にポーリングして、通知と状態の更新を取得します。ポーリングを削除し、Web ソケットを使用して「プッシュ」に置き換えたいと考えています。
任意のインスタンスはクライアントからの Web ソケット リクエストを処理し、それらの Web ソケットを保持します。また、プッシュのソース データを提供する同じインスタンス上にないクライアントにデータをプッシュする必要があるため、データをルーティングする方法が必要です。適切なインスタンスに接続し、そのインスタンスから適切なクライアント Web ソケットに接続します。
私たちは、apache/mod_wsgi が Web ソケットでうまく機能しないことを認識しており、これらのコンポーネントを nginx/gunicorn に置き換え、gevent-websocket ワーカーを使用する予定です。ただし、いくつかのワーカー プロセスの 1 つがクライアントから Web ソケットを確立する要求を受信し、ワーカー プロセスの有効期間がメインの gunicorn プロセスによって制御されている場合、他のワーカー プロセス、または実際には非 gunicorn プロセスがどのように処理されるかは明確ではありません。これらの Web ソケットにデータを送信できます。
具体的なケースとしては、HTTP リクエストを発行するユーザーが 1 つの EC2 インスタンス (ホスト) に転送され、目的の動作は、まったく別のインスタンスで Web ソケットを開いている別のユーザーにデータが送信されることです。各インスタンスで実行されているメッセージ ブローカー (rabbitmq など) が、Web ソケットを介してそのインスタンスに接続されたクライアントに送信されるデータを含むメッセージを送信できるシステムを容易に想像できます。しかし、これらのメッセージのハンドラーは、gunicorn のワーカー プロセスで受信した Web ソケットにどのようにアクセスできるのでしょうか? gevent-websocket で作成され、ワーカーが使用できる高レベルの Python Web ソケット オブジェクトはピクルできません (ピクルをサポートしないインスタンス メソッドです)。処理する。
実際、この問題の根本は、クライアントからの HTTP リクエストによって開始され、gunicorn などのサーバー内の WSGI ハンドラーによって処理される Web ソケットに、外部プロセスからどのようにアクセスできるのかということです。HTTP 要求を処理することを目的としたgunicornワーカー プロセスが長時間実行されるスレッドを生成して Web ソケットにハングアップし、他のプロセスからのメッセージ処理をサポートして、それらのワーカーを介して接続された Web ソケットにメッセージを送信するのは正しくないようです。プロセス。
私が説明した環境で、Web ソケットと WSGI ベースの HTTP 要求ハンドラーがどのように相互作用する可能性があるかを説明できる人はいますか?
ありがとう。