1

ブートストラップしているガレージのスタートアップのために、クラウドでAkkaベースのアプリケーションを構築しようとしています。アプリの性質上、セミステートフルであり、パフォーマンスのために可能な限りRAMにキャッシュされます。(定期的にシャットダウンおよび再起動することは許容されますが、ほとんどの場合、アクター内のキャッシュされた情報を介して操作する必要があります。)

このアーキテクチャはサーバーのクラスター用に設計されており、必要に応じてサーバー間で通信するため、ノードAのユーザーセッションは、必要に応じてノードBのミドルウェアアクターにクエリを実行できます。だから私の質問は、CloudBeesではそれがどれほど難しいかということです。

このページからの私の理解は、この種のクラスター内通信を管理する自動ディレクトリサービスはまだないということですが、おそらくそれで生きることができます-最悪の場合、DBを介して検出を管理できるはずです。各ノードは、起動時に自身を登録し、他のノードとの多対多の通信を開きます。

しかし、私が確認したいのは、このコミュニケーションが単純であるということです。各ノードには、他のノードが接続するようにアドバタイズできる信頼性の高いローカルIPがありますか?これは、アプリケーションのこの実行中に少なくとも安定していますか?または、ノードがこのアプリを実行している残りのノードにそのアドレスをアドバタイズするための別の/より良い方法はありますか?

(アプリのノードはすべて同じDBインスタンスを共有していると思います。)

ここでのガイダンスは大歓迎です。私はすぐにホスティングプロバイダーを選び、最も有望なオプションとしてCloudBeesに戻り続けたいと思います...

4

1 に答える 1

4

現在、相互に通信するインスタンスに制限はありません。秘訣はメンバーシップを発見することです。メンバーシップを追跡できる API がまもなくリリースされますが、現時点では次のように動作する可能性があります。

  • ポートを取得するには、$PWD/.genapp/ports のファイル名を調べます (アプリケーションは複数のポートを持つことができるため) - (例: System.getenv("PWD") + ".genapp/ports" - その中のファイルを一覧表示します)ディレクトリ - 通常は 1 だけです - ファイル名はポートです)。他にも方法があります。たとえば、JVM アプリの「sun.java.command」システム プロパティも使用できます。
  • ホスト名は通常の方法で取得できます (例: InetAddress.getLocalHost().getHostName()): このホスト名はプライベート名になります。つまり、プライベート IP に解決されます。ノード間の通信に適しています。
  • パブリック IP/ホスト名: 次の URL に対して (サーバーから) HTTP get を実行します: http://instance-data/latest/meta-data/public-hostname(もちろん、サーバー側のパブリック IP のみが返されます)。

( http://developer-blog.cloudbees.com/2012/11/finding-port-or-address-of-your.htmlを参照)

次に、あなたが言うように、起動時に適切なポート/プライベートホスト名をDBに登録し、各ノードでそれを読み取ってクラスターを「シード」できます(akkaはすべてのメンバーについて知る必要はありません-シードだけで十分です) ) 2 フェーズのスタートアップだと思います: 1: ホスト/ポートを登録し、2、他のメンバーを探し、ローカルの Akka 構成にシード メンバーとして追加します (他のノードのスタートアップとして、しばらくの間、定期的に同じことを行う必要がある場合があります -十分にシードされていることを確認するため)

ここでAkkaのセットアップを読んだところから: http://doc.akka.io/docs/akka/snapshot/scala/remoting.html

ポートを指定できるようです-可能であれば、それを app_port 環境変数に設定します-つまり、各ノードはプライベートホスト名を介してそのポートと通信できます。ただし、http トラフィックもそれにルーティングされます-akka はこれも処理できます-または、akka 用の個別のポートと任意の http インターフェース用の別のポートが必要ですか?

于 2012-11-06T03:18:05.490 に答える