1

既存のオンラインゲーム用のキャッシングプロキシコンポーネントとともに、新しいクライアントを構築しています。現在の設定は次のようになります。

  Server
  |     \
 TCP    TCP
  |       \
Client1  Client2

新しい設定は次のようになります。

 Server
 |   |
TCP TCP
  \   \
   Proxy          <-- (New!)
   |    \
  0MQ   0MQ
   |      \
Client1  Client2  <-- (New!)

プロキシコンポーネントは既存のゲームサーバーの近くに配置され、古い回線ベースのTCPプロトコルをサーバーに話し、0MQを介して新しいGoogleプロトコルバッファベースのプロトコルを新しいクライアントに話します。サーバーとそのクライアント間でメッセージを転送および変換することに加えて、プロキシはクライアント宛てのメッセージをキャッシュ(protobuf)します。

サーバーはクライアントの要求に応答しますが、特定のクライアントまたはすべてのクライアントに一方的なメッセージを送信する場合もあります。プロキシは特定のクライアント宛てのメッセージのキャッシュを維持するため、各クライアントに関連付けられた状態を維持する必要があります。

ZeroMQガイドをかなり読んでいますが、その「パターン」またはソケットの組み合わせのどれがこのセットアップに最適かはまだわかりません。ここに行くための最良の方法についてアドバイスを与えることができるZeroMQウィザードがそこにあることを願っています。

質問は言語固有ではありませんが、プロキシコンポーネントはJavaで記述され、クライアントはC#で記述されます。

よろしくお願いします!

4

3 に答える 3

4

非同期クライアントサーバーパターンがあなたを近づけると思います。各クライアントは、プロキシのROUTERソケットに接続するDEALERソケットを作成します。サンプルのJavaソースを確認します。フロントエンド/ROUTERソケットを使用し、バックエンド/ディーラーソケットを省略して、ServerTaskクラスに基づいてプロキシを作成できます。

サーバーはクライアントの要求に応答し、一方的なメッセージを任意のクライアントに送り返すことができます。クライアントが少なくとも1つのメッセージを送信した後、各クライアントのソケットIDをキャッシュする必要があります。

ゲームサーバーへのTCP接続は、概念的にはサーバーとワーカー間のバックエンドDEALERソケットに似ていますが、接続はクラシックTCPであり、ZeroMQではないため、ZeroMQソケットを使用できず、カスタム処理を行う必要があります。また、カスタムソリューションでは、従来のTCPソケットと統合するときに、ZeroMQの同時実行ルールに違反しないことが必要です。

これが1つの方法です-一連のPAIRソケット(AとBと呼びましょう)とBlockingQueueを使用して、ZeroMQとTCPソケットの間のブリッジとして機能します。そして、TCPRead、TCPWrite、ZeroMQの3つのスレッドを作成します。

TCPReadは、TCP接続からゲームサーバーに読み取ります。それらをprotobufメッセージに変換し、Aソケットを介して転送します。

TCPWriteは、BlockingQueueをポーリングしてメッセージを探します。メッセージを受信すると、メッセージを変換し、TCP接続を介してゲームサーバーに送信します。

最後に、ほとんどの作業はZeroMQスレッドで行われます。ZeroMQポーリングを使用し、ルーターソケット(すべてのクライアントからのすべてのメッセージ用)とBソケット(ゲームサーバーからのメッセージ用)を常にポーリングしています。クライアントへのメッセージの送信は簡単で、メッセージをルーターソケットに送信し、メッセージの前にクライアントのソケットIDを付けることで処理されます。サーバーへのメッセージの送信は、BlockingQueueにメッセージを追加することによって行われます。TCPWriteによって取得され、ゲームサーバーに転送されます。

この基本的な設計が機能するようになったら、さまざまなパターンで説明されているように、簡単に作業を行ったり、ワーカーを追加したりできます。

お役に立てれば。

于 2013-01-16T17:59:57.777 に答える
1

また、rawモードで0MQ ROUTERソケットを使用することもできます。つまり、2つのROUTERソケットを使用してプロキシを作成できます。親から子へのスレッドパイプを除いて、PAIRソケットには近づかないでしょう。

于 2013-01-16T21:54:06.493 に答える
0

ZeroMQのドキュメントを読み進めるには、しばらく時間がかかります。私はそうし、非同期クライアントサーバーは私が最初に望んでいたものに近いという結論に達しました。

しかし、それは完全ではありませんでした。それで私はビルドに進みました。

私が実際に欲しかったのは、さまざまな例から学んだことです。私が最終的に得たものの完全な説明は、参照用または実際のライブラリとして役立つ可能性のあるコードと同様に、ここにあります。

于 2014-07-05T14:35:56.353 に答える