8

現在、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 要求ハンドラーがどのように相互作用する可能性があるかを説明できる人はいますか?

ありがとう。

4

2 に答える 2

0

HTTP 要求を処理することを目的とした gunicorn ワーカー プロセスが長時間実行されるスレッドを生成して Web ソケットにハングアップし、他のプロセスからのメッセージ処理をサポートして、それらのワーカーを介して接続された Web ソケットにメッセージを送信するのは正しくないようです。プロセス。

なぜだめですか?結局のところ、これは長時間実行される接続です。そのような接続を処理するための長時間実行されるスレッドは、私にとってはまったく自然なことのように思えます。

多くの場合、これらのイベントが発生した状況では、書き込みは読み取りとは別に処理されます。

現在 Websocket 接続を処理しているワーカーは、関連するメッセージがメッセージング サーバーから送信されるのを待ち、それを Websocket に渡します。

必要に応じて、gevent の非同期対応のキューを使用して、コード内メッセージの受け渡しを処理することもできます。

于 2013-03-08T04:48:52.343 に答える