質問

Scala + Akkaのサーバーシステムを開発しており、Android、iPhone、Second Lifeのクライアントにサービスを提供しています。このサーバーには、複数のマシンで実行され、非常に利用できる必要がある部分があります。これらのサーバーのいずれかが(たとえば、ハードウェア障害の)死亡した場合、システムは実行を続ける必要があります。 Cassandraの仕組みと同様に、クライアントに接続しようとするマシンのリストをクライアントに持ってほしいと思います。

Akkaでこれまでに見たマルチノードの例は、高可用性ではなく、スケーラビリティのアイデアを中心にしているように思えます(少なくともハードウェアに関しては)。マルチノードの例には、常に単一の障害ポイントがあるようです。たとえば、ロードバランサーはありますが、ロードバランサーを持つマシンの1つを再起動する必要がある場合、私のシステムはダウンタイムに苦しみます。

このタイプのハードウェアフォールトトレランスをAkkaに示す例はありますか?または、これを実現するための良い方法について何か考えがありますか?

これまでのところ、私が思いついた最良の答えは、Erlang OTPドキュメントを研究し、それらを瞑想し、Akkaで利用可能なビルディングブロックを使用して私のシステムをまとめる方法を見つけようとすることです。

しかし、複数のマシン間で状態を共有する方法に関するリソース、例、またはアイデアがある場合、そのうちの1人が走り続けている場合、私はそれらに感謝します。ここのホイール。多分、複数のノードで共有状態を自動的に同期させるマルチノードSTMコンテナがありますか?あるいは、これを簡単に作成することができるので、ドキュメントがそれを行う方法の例を悩ませないか、おそらく私はまだ私の研究と実験で十分に徹底していないでしょう。どんな考えやアイデアが高く評価されます。

役に立ちましたか?

解決

HAと負荷管理はスケーラビリティの非常に重要な側面であり、 AkkaSource 商業用品。

他のヒント

すでにクライアントに複数の潜在的なホストをリストしている場合、それらは効果的にロードバランサーになる可能性があります。

ホストの提案サービスを提供し、クライアントに接続するマシン(現在の負荷などに基づいて)を推奨すると、クライアントは接続が失敗するまでそれに固定できます。

ホストの提案サービスがそこにない場合、クライアントは単に内部リストからランダムホストを選択し、接続するまで試してみることができます。

理想的には、初めての起動時に、クライアントはホスト提案サービスに接続し、適切なホストに向けられるだけでなく、他の潜在的なホストのリストも同様です。このリストは、クライアントが接続するたびに日常的に更新できます。

ホストの提案サービスがクライアントの最初の試み(ありそうもないが...)でダウンしている場合、クライアントインストールのホストのリストを事前にデプロイできるので、それが存在する場合、最初からホストをすぐにランダムに選択することができます。

ホストのリストは、IPSではなく実際のホスト名であることを確認してください。インフラストラクチャを移動し、ipsを変更します)。

あなたはその方法を見ることができます reddwarf そしてそれはフォークです dimdwarf 構築されています。どちらも水平方向にスケーラブルなクラッシュのみのゲームアプリサーバーであり、DimdwarfはScala(新しいメッセージング機能)で部分的に記述されています。彼らのアプローチとアーキテクチャはあなたのニーズを非常にうまく一致させるべきです:)

2セント..

「複数のマシン間で状態を共有する方法は、そのうちの1人がダウンしている場合、物事が実行され続けます」

マシン間で状態を共有しないでください。代わりに、マシン全体でパーティション状態になります。私はあなたのドメインがわからないので、これがうまくいくかどうかはわかりません。ただし、基本的に、特定の集計(DDD用語で)を特定のノードに割り当てると、使用中にそれらの集合体をメモリ(アクター、エージェントなど)に保持できます。これを行うには、Zookeeperのようなものを使用して、どのノードがどのノードをハンドルするかを調整する必要があります。障害が発生した場合、別のノードに集計を持ち込むことができます。

さらに、イベントソーシングモデルを使用して集計を構築すると、イベントを聞いて自分のコピーを維持するノードによって、他のノードにリアルタイムコピー(奴隷)を持つことがほとんど些細なことになります。

Akkaを使用することにより、ノード間をほぼ無料でリモートすることができます。これは、他のノード上の集計/エンティティと対話する必要がある可能性のあるリクエストをリモータンで行うことができるリクエストを処理することを意味します。

ここで私が概説したことは非常に一般的ですが、AkkaとZookeeperとの分散断層トレランスへのアプローチを提供します。それは助けになるかもしれないし、そうでないかもしれない。私はそれがすることを願っています。

すべて最高、アンディ

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top