私は Java/scala akka の概念実証を書いていますが、現在、クラスター環境でのアクターの概念をいじっています。
仕様
システムが同じメッセージを複数のノードに送信する特定の状況があります。私の仕事は、これらのメッセージをドロップせず、1 つのメッセージだけをバックエンド システムに渡すことです。負荷分散/フェイルオーバー機能を備えた独自のフィルターのように。
考え
私は 2 つのノードで 2 つの「フロントエンド」アクターを使用することを考えていました。システムは、バックエンドに送信するフロントエンド アクターに送信するフロントエンド ルーター (ラウンド ロビンとしましょう) にメッセージを送信します。
もう 1 つのフォールバック ソリューションは、リーダーだけがバックエンドに送信するシステムを使用することです。このシステムでは、全員が同じメッセージを受け取り、リーダーだけがそれを転送します。
問題
私が直面している問題 (コードを参照) は、ルーターが既存のフロントエンド アクターをクラスターのルートとして使用することです。これは、サンプル コードでは失敗します。これは、ルーターがroutees-path (config 設定) によってルートをローカルでのみ検索し、何も見つからずに終了するためです。
ルーターがクラスターノードにルートを展開する構成でも成功していません。常にローカルに展開します。
ここにサンプルコードがありますhttp://ge.tt/2UHUqoQ/v/0?c。2 つのエントリ ポイントがあります * TransformationSample.App2 - コマンドライン パラメータ 2551 と 2552 をそれぞれ使用して 2 つのインスタンスを実行します (シード ノード) * TransformationSample.App1 - コマンドライン パラメータを使用せずに 1 つのインスタンスを実行します
App1 は、ルーターを作成して通信しようとするものですが、フロントエンド ルーターをローカルで見つけることができないため、ルーターは終了します。問題は akka.cluster.routing.ClusterRouteeProvider クラスの createRoutees メソッドの行 178 https://github.com/akka/akka/blob/releasing-2.1.0-RC1/akka-cluster/src/main/scalaに固定されています/akka/cluster/routing/ClusterRouterConfig.scala .
最後に
私はおそらくここで何か間違ったことをしているので、私の scala を許してください (これは私が書いている最初のプロジェクトです)。
このルーターが機能することを望んでいる理由は、概念実証の次のステップは、フロントエンド アクターが送信する (別の) バックエンド クラスター ルーターと通信する同様の設定でバックエンド システムの負荷を分散することであるためです。バックエンド アクターに対してラウンド ロビンで動作します。
これはオーバーエンジニアリングですか?フロント部分のフェイルオーバーとバック部分の負荷分散が必要です。