考えがある。以下のシナリオに従ってメッセージを処理する WebSocket ベースの RPC を記述します。
- クライアントは WS (Web ソケット) サーバーに接続します
- クライアントが WS サーバーにメッセージを送信する
- WS サーバーはメッセージを受信キューに入れます (マルチプロセッシング キューまたは RabbitMQ キューにすることができます)。
- プロセス プール内のワーカーの 1 つがメッセージを取得して処理します。
- メッセージが処理されています (非常に高速または非常に遅い場合があります。WS サーバーには関係ありません)。
- メッセージが処理された後、処理の結果が送信キューにプッシュされます
- WS サーバーはキューから結果をポップし、クライアントに送信します。
注:重要な点は、WS サーバーはノンブロッキングであり、次のことのみを担当する必要があるということです。
- 接続受付
- クライアントからメッセージを取得し、受信キューに入れる
- 送信キューからメッセージを取り出してクライアントに送り返す
注 2:クライアント ID を何らかの方法で保存し、クライアントからのメッセージと共に渡すことをお勧めします。
注 3:メッセージを前後にキューイングするため、単純なメッセージ処理 (たとえば、メッセージを入力として取得し、結果としてそれをプッシュバックする) の速度が低下することはまったく問題ありません。ターゲットの目標は、高速メッセージを処理するのと同じコード スタイルを使用して、プールでプロセッサの負荷の高い操作 (実用的ではない大まかな例: いくつかのネストされた「for」ループ) を実行できるようにすることです。つまり、ある種のクライアント ID と一緒に入力キューからメッセージをポップし、それを処理し (時間がかかる場合があります)、処理結果をクライアント ID と一緒に出力キューにプッシュします。
質問:
- TornadoWeb で、キュー (マルチプロセッシングまたは Rabit) がある場合、そのキューに新しい項目があるたびに Tornado の IOLoop にコールバックをトリガーさせるにはどうすればよいですか? 既存の実装がある場合は、そこに案内してもらえますか?
- そのような設計のすぐに実装できるものはありますか? (トルネードとは限りません)
- そのような設計を実装するには、別の言語 (python ではない) を使用する必要があるのでしょうか?
謝辞:
- 達成しようとしている目標に REST と WSGI を使用するという推奨事項は歓迎されません
- 「これは、2秒間グーグルで見つけたコードへのリンクです。トルネードとマルチプロセッシングからのインポートがいくつかあります。それが何をするのかはわかりませんが、99% の確率で、まさにあなたが必要としているものであると確信しています」も歓迎されません。
- 通常のブロッキング ライブラリの代わりに非同期ライブラリを使用する推奨事項は ... :)