1

gen_server/gen_fsm を erlang ノード A から erlang ノード B に移動し、その内部状態を保持するための推奨される方法 (ある場合) を知りたいです。

4

1 に答える 1

1

私の知る限り、erlangノード間でプロセスを転送する方法はありません。これを禁止する多くの理由を考えることができます。他のノード間では、内部ノードメモリを台無しにする可能性があります。単にデータを保持するプロセスを検討してください(内部の「状態」ループ以外)パラメータ) プロセス ディクショナリ (プロセス ヒープ)、バイナリ (異なるガベージ コレクション メソッド)。

回避策の 1 つは、gen_fsm/gen_server に、サーバー/ステート マシンの内部状態を同時に再作成する新しいプロセスを生成できるメソッドを提供することです。実装するには、単純に2つの開始関数を使用できると言うのは難しいと思います:

  • 動作を初期化するもの(あなたが今やっていると思うように)
  • ノードも取り、リモートメソッドを介して開始し、そのノードでサーバーを呼び出し、状態を初期化します(init / 1関数によって、またはメッセージを送信することによる明示的な方法で、つまりサーバーの状態)

しかし、ここには 2 つの主な問題があると言わざるを得ません。

  • 同期: プロセスを確認する必要があります: リモートノードでサーバーを起動する -> リモートサーバーの状態を設定する -> 現在のローカルサーバーを強制終了することはアトミックです
  • Coherence: ローカル プロセスを参照する他のプロセスは、リモート プロセスへの参照を切り替える必要があります。

前者は多くの方法で解決できます (私の 2 セント: ローカル サーバーとリモート サーバーの間の明示的なメッセージ パッシング - オーバーヘッドですが、Erlang ランタイム システムを考慮すると防弾です)、後者はモニター/リンクと終了の戻り値 (リモート サーバー pid) で解決できます。または、gen_event プロセスを使用したパブリッシュ/サブスクライブ モデルを使用した、より洗練された方法です。

問題を解決し、必要に応じて質問するのにこれが役立つことを願っています!

于 2012-03-06T13:22:35.500 に答える