オンラインゲームのサーバー側アーキテクチャ


7

基本的に私はそれが取るほとんどすべてのアクションのためにサーバーと通信するゲームクライアントを持っています、ゲームはJava(LWJGLを使用)であり、今すぐサーバーの作成を開始します。

ゲームの基本は通常、1つのクライアントがサーバーとのみ通信することですが、いくつかの機能を使用するには、後で複数のクライアントが連携する必要があります。

認証サーバーを分離する方法をすでに読んだので、それを実行するつもりです。問題は、私がこの種のサーバー側プログラミングに完全に不慣れであることです。これまでにプログラミングしたのはJSF Webアプリケーションだけでした。

HTMLは非常に遅いので、ほとんどすべてのゲーム通信でソケット接続を行うと思いますが、それでもサーバーのどこから開始すればよいかわかりません。

どこから始めればよいか、ゲームサーバーに必要なアーキテクチャ、およびクライアント/サーバー間通信を実現するのに役立つフレームワークに関する提案を読んでいただければ幸いです。

私はJNAGを調査しましたが、この種の経験はありません。そのため、それが堅固で優れたメッセージング層であるかどうかは本当にわかりません。

どんな助けでもありがたいです...ありがとう!

編集:

ゲームに関するもう少しの情報。これは、いくつかの機能を備えた非常に複雑なゲームで、一部の機能をプログラム内の「プログラム」にすることを目的としています。FPSやRPGのような通常のゲームではありませんが、多くのユーザーがこれらのさまざまな「プログラム」をゲーム内で使用することを意図しています。

私が十分に明確でなかった場合、Javaクライアント/サーバーアーキテクチャでゲームをすでに開発している人々、それらがどのように通信するか、フレームワーク、API、メッセージングシステムなどに本当に感謝します。

それは言語の知識不足の問題ではなく、アドバイスの問題なので、私はうまくいくものを作成することにはなりませんが、後の段階で何らかの制限の理由で書き直さなければなりません。PS:私の英語が完璧でないと申し訳ありません...


1
Multiverseサーバーは覚えている限りJavaで書かれていますが、すでにゲームを持っているようです。あなたはここで見ることができるの概要それでも、素敵なハイレベルがあります:update.multiverse.net/wiki/index.php/...
DrDeth

ゲームサーバーのアーキテクチャは、一般的にゲームによって定義されます。それはプラットフォームとジャンルに非常に依存しています。多くのユーザーを計画している場合、JavaはAmazonの[Elastic Beanstalk] [1]を利用する良い機会です。これは、オンデマンドでサーバーをスケーリングするための優れた方法です。多分あなたはゲームについてもっと私たちに言うべきです-JNAGはあなたが必要とするものよりも多くなる可能性があります。最大4プレーヤーのターンベースのゲームで。[1]:aws.amazon.com/elasticbeanstalk
Konrad K.

回答:


12

残念ながら、私はこのトピックに関する(良い)オンラインリソースや本を知りません。そして、私はJavaを知りません。ただし、まだ回答が得られていないので、個人的な経験からいくつかのヒントを紹介します。

まず、高速で信頼性の高い RPC、または少なくともメッセージキューのメカニズムが必要です。これは、クライアントサーバーとサーバーサーバーの両方の通信に使用されるものです。Java用の既成のソリューションがあるかどうかはわかりません。.NETでは、このメカニズムが非常に重要であるため、常に独自のカスタムを作成していました。最も一般的には、TCPを介した軽量のバイナリメッセージプロトコルが使用されますが、ゲームの種類によっては他のオプションの方が適している場合があります。ターンベースの戦略はXMLまたはSOAPの方が優れている場合があり、ペースの速いシューティングゲームがUDPを保証する場合があります。

メッセージングシステムの最低限の要件は、リモートアクションの順序を保証しながら、確実にリモートアクションを呼び出す機能です。本当に役立つ追加は、リクエストアクションパターンのサポートです。このパターンでは、リモートアクションが何らかの結果をイニシエーターに返す場合があります。これは必須ではありませんが、あなたの人生をずっと簡単にすることができます。

メッセージングを取得したら、サーバーのパーティション分割について考えます。ほとんどの場合、1台のサーバーマシンでは、すべてのプレイヤーのゲームをホストするには不十分です。どのタスクが互いに独立していて、異なるサーバーに委任できるかを慎重に検討する必要があります。認証とログインは、このパーティション分割の最も明白な候補です。とりわけ、統計および評価計算、データベース通信(特殊なDBキャッシュとして機能するサーバー)です。Webアプリとは対照的に、MMOゲームの問題は、それらが非常にステートフルになりがちで、各プレーヤーに大量のデータが必要になることです。また、ほとんどの操作では、このデータのすべてまたはほとんどすべてにアクセスする必要があります。

単一のサーバーを使用する場合でも、複数のプロセッサを活用する必要があります。すべてのMMOサーバーは、高度に並行なプログラムです(現在のサーバーには約30の並行スレッドがあります)。同期の問題を解決するには、さまざまなスレッドを分離する必要があります。さまざまなサーバーと同様に、サーバーには独自のデータがあり、何らかのメッセージ受け渡しインターフェースを使用して通信します。おそらく、十分に高速であれば、ネットワークで使用しているものと同じRPCでもかまいません。

次に、データベースがあります。MMOプレイヤーは通常、データベースに保存する必要のある多くのことを行い、ゲームの世界に多くの変化をもたらします。私が使用していたすべてのサーバーは、これらをすぐには保存しませんでした。代わりに、変更がメモリに蓄積され、5分ごとに大量に保存されました。これにより、書き込みが行われるときに遅延が発生する可能性がありますが、ゲームはよりスムーズに進行します。この遅延が、データベース通信用に別のマシンを使用する主な理由です。

通常、MMOゲームはデータバックエンドとしてリレーショナルデータベースを使用しますが、NoSQLデータベースの方が優れていると思います。通常、DBには文字ごとに大量のデータがあり、その文字がログインしたときにすべてのデータをロードします。複雑なクエリを実行することはほとんどありません。この操作モードはNoSQLの長所のようです。とは言っても、実際のMMOサーバーでNoSQL DBをまだ使用していないので、ここでは間違っているかもしれません。

私が警告したいもう一つのデータベース関連の事柄はこれです。特にプロダクションサイクルの初期の多くの開発者は、「ゲームデザイン」のデータをDBに保存しようとしています。私は、アイテムやNPCのパラメーター、能力、その他のようなものについて話しています。それをしないでください。これらは実際には静的データであり、サーバーの更新がない限り変更されません。このデータは常にサーバーで必要です。通常、SELECT * ...サーバーの起動時を除いて、それに対してクエリを実行することはありません。したがって、実際にはデータベースは必要ありません。これらをDBに置くことには多くの欠点があります。まず、データベースをソース管理下に置くことはできません。

これらは、MMOサーバーアーキテクチャの3つの主要コンポーネントです。ネットワーク通信、ロジックパーティション、データベースアクセスです。これら3つを使用するすべてのロジックは、おそらく非常にゲームに依存しています。より具体的な質問をして、ゲームについて詳しく教えていただければ、アドバイスが増えるかもしれません。


もっとアドバイスをもらいたいのですが、直接連絡する方法(PMなど)が見つかりません。私のゲームの内部を公開したくないだけです。
ドライケン

gmail dot com内のcthulhu dotでメールまたはgoogletalkを介して私に連絡できます。
Nevermind '18年

4
ここではできるだけ質問することを強くお勧めします。非公開ではありません。そうすれば、より多くの人々に利益がもたらされ、より良い答えが得られます。
Nevermind '18

0

あなたはおそらくソケットプログラミングを調べたいでしょう。ここでは、始めるのに役立つ基本的な概要を示します。

または、Javaソケットの Google検索を実行するだけで、たくさんの資料が見つかります。


1
私は以前にソケットを使用したことがあり、RMI、EJB、およびその他の通信方法を使用しましたが、問題はそれを使用する基本ではなく、それを使用する方法、またはこの方法またはその方法を使用する理由です。
Draiken

ああ。その時あなたの質問を読み間違えました。ごめんなさい。
bummzack 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.