私は、scala と Akka で書かれた Minecraft サーバーであるはずの bc 論文プロジェクトに取り組んでいます。サーバーは、クラウドまたはクラスターに簡単に展開できる必要があります (適切な用語を使用するかどうかはわかりません...複数のノードで実行する必要があります)。しかし、私はakkaの初心者であり、そのようなことをどのように実装するのか疑問に思っていました. 私が今理解しようとしている問題は、異なるノードのアクター間で状態を共有する方法です。私の最初のアイデアは、Minecraft クライアントから tcp ストリームを読み取り、それをロード バランサーに送信して、リクエストを処理するノードを選択し、tcp 経由でクライアントに応答を送信する Camel アクターを用意することでした。ユーザーによって提供された資格情報が有効かどうかをチェックする AuthenticationService 実装アクターがあるとしましょう。すべてのノードにはそのようなアクター (またはおそらくそれ以上) があり、すべてのアクターは常にユーザーのまったく同じデータベース (または状態) を持つ必要があります。私の質問は、この状態を維持するための最良のアプローチは何ですか? 考えられるいくつかの解決策を思いつきましたが、このようなことは何もしていないので、欠点を指摘してください:
解決策 #1: データベースに状態を保持します。これは、状態がユーザー名とパスワードのリストなどによってのみ表されるこの認証の例ではおそらく非常にうまく機能しますが、状態に整数や文字列に簡単に分割できないオブジェクトが含まれている場合はおそらく機能しません。
解決策 #2: 特定のアクターに状態を変更するリクエストがあるたびに、アクターはリクエストを処理した後、同じタイプの他のすべてのアクターに変更に関する情報をブロードキャストします。元のアクターによって送信された情報。これは非常に非効率的で、かなりぎこちないようです。
解決策 #3: 特定のノードを一種の状態ノードとして機能させ、サーバー全体の状態を表すアクターを配置します。そのようなノードのアクターを除く他のアクターは状態を持たず、データが必要になるたびに「状態ノード」のアクターに問い合わせます。これも非効率的で、一種のフォールト・ノンプルーフのようです。
それで、あなたはそれを持っています。私が実際に気に入っている唯一の解決策は最初の解決策ですが、私が言ったように、おそらく非常に限られた問題のサブセットでのみ機能します (状態を redis 構造に分割できる場合)。より経験豊富な教祖からの応答は非常に高く評価されます。よろしく、トーマス・ハーマン