マルチプレイヤー ビデオ ゲームで同様のスキルを持つプレイヤーをキューに登録できる Web サイトを作成しています。単純な Web バックエンドは、データベースを変更し、テンプレートを使用して応答を作成するだけですが、それに加えて、私のバックエンドは次のことを行う必要があります。
- プレイヤーがキューまたはプレイ中にリアルタイムで (gevent-socketio を介して) 通信する
- バックグラウンドで計算を実行してバランスの取れたゲームを見つけ、待機時間が長くなるにつれてゲームの品質を徐々に低下させます (ゲームが見つかったときに SocketIO を介してプレイヤーに通知します)
- UDP ソケットを介して進行中のゲームを監視し (プレイヤーが切断した場合は、キューに代わりのプレイヤーを要求します)、最終的に結果でデータベースを更新します
これらのことを個別に行う方法はわかっていますが、これらのコンポーネントをどのように分離して通信できるようにするべきか疑問に思っています。私のWebフレームワーク(Flask)は、これらの他のことにあまり関与すべきではないと思います。
すでに gevent を使用する必要があるため、現在、これらのタスクごとに個別の greenlet を開始することを計画しています。これは、通常、何かが起こるのを待っているため、すべてのタスクで機能します (計算は例外となる可能性があります)。ただし、これ以上 Flask インスタンスを実行できないため、これはまったくスケーリングしません。すべては、単一のスレッドで実行される greenlet に依存します。
これが最善の方法ですか?これらのタスクを分離する別の方法はありますか (特に、コルーチンを持たない将来使用する可能性のある言語の場合)。RabbitMQ/ZeroMQ や Celery などのツールについて聞いたことがありますが、この問題を解決するためにそれらをどのように使用するか、どのように使用するかはわかりませんでした。