5

多くのgen_serverを起動するスーパーバイザーがあります。各 gen_server には多くの時間がかかる大量のデータ負荷があります。エラーがいつ発生したかを知りたいのですが、gen_server の状態とそのプロセス dict に保存されているデータは、次回の起動のために保持されるので、再度初期化する必要はありませんか?

4

2 に答える 2

11

アーランの動作の現在の状態はどこにも保存されません。あなたはそれを自分で世話する必要があるでしょう。

状態を外部のどこか(別のプロセス、ETSテーブル、データベースなど)に定期的に保存するか、init/1関数が起動時に状態を再作成できるように十分にスマートで動的であることを確認します(既存のファイルを復元し、再作成します)元の入力引数などに基づくキャッシュ)

基本的に、クラッシュに耐えるデータと、それを永続化または再作成する方法を定義する必要があります。

于 2011-07-30T10:04:54.527 に答える
1

アプリケーションのクラッシュを持続させる必要のあるデータがアプリケーションにある場合は、そのデータをアプリケーションからデータベース(Mnesia)またはに分離する必要がありますETS/DETS tables。gen_serverの状態 live/temporary/transient に、アプリケーションの一時的な状態をすばやく操作できるようにする情報を含めます。
gen_server init / 1が呼び出されたらすぐに、構成ファイルまたはデータベースを読み取って開始状態を取得します。通常、アプリケーションがサーバーの最後の状態に大きく依存している場合、gen_server状態を操作するリクエストが着信するたびに、そこから情報を抽出して永続ストレージにコピーします(このデータに以前の既知の状態のラベルを付けます) )。これにより、init / 1関数は常に最後/前の状態をチェックしたり、新しい状態を開始する必要があるかどうかをチェックしたりできます。

于 2011-07-30T12:00:44.607 に答える