2009-05-10 12 views
7

クラッシュしたプロセスを再起動するときに状態を保持するにはどうすればよいですか?クラッシュ後にプロセスの状態を復元するにはどうすればよいですか?

私はいくつかの "サブシステム" gen_serversを監視するOTPアプリケーションにスーパーバイザを持っています。

例えば、1つは「天気」サブシステムで、15分ごとに新しい天気状態を生成し、天気の現在の状態のクエリを処理します。

このgen_serverがクラッシュした場合、再起動したいが、init()でハードコードされている最新の気象状態ではなく、最新の気象状態で再起動する必要があります。クラッシュのせいでシミュレーション状態が突然「雹の嵐」から「心地よくて気持ち良い」に変わるのは理にかなっていません。

複雑さが増したため、すべてのアップデート後に状態を保存するために、mnesiaまたはETSを使用することを躊躇します。簡単な方法はありますか?

答えて

4

ランタイム中だけである必要がある限り、ETSの使用を示唆します。値は複雑さよりはるかに大きい。 APIはシンプルで、名前付きテーブルで作業している場合はアクセスも簡単です。スーパーバイザによってgen_serverが起動される前に、テーブルを作成する必要があります。

二 - より複雑な - 代替案:

  • ビルドプロセスのペア、実行するジョブの1、状態維持のために1。第2の単純さのために、それは本当に信頼できるでしょう。
  • 現実の愚かなものは、状態が変化するたびに、現在の状態を引数とする管理者の子の仕様を交換することができます。 (笑)いいえ、ちょうど冗談です。
2

がありますか?あなたは、サーバーが起動しますとき(をINIT)(mnesiaまたはスーパーバイザの状態で)監督に格納するために、この値を使用できるように

のプロセスが死んだことを、プロセスの状態を含む監督にメッセージを送信します状態値を取得するには、スーパーバイザに同期コールを送信する必要があります。私は実際の例はありませんが、意味があると思います。

とにかく、私は実際に状態をmnesiaに保存するのに問題はありません。

申し訳ありません。私の英語:)

+1

スーパーバイザにはできるだけ論理が少なく、再起動の責任があります。そのロジックの単一のバグは、サブツリー全体がクラッシュする可能性があります。 –

関連する問題