3

gen_serverハードウェアセンサーからの情報を定期的に要求するワーカーが何人かいます。センサーが一時的に故障する場合がありますが、これは正常です。センサーが失敗した場合、ワーカーは例外で終了します。

simple_one_to_oneすべてのワーカーは、戦略を持つスーパーバイザーから生成されます。またgen_server、ワーカーを開始および停止し、'DOWN'メッセージを受信できるコントロールもあります。

だから今私は2つの問題があります:

  1. ワーカーがスーパーバイザーによって再起動されると、その状態が失われます。これは私には受け入れられません。同じ状態でワーカーを再作成する必要があります。

  2. ワーカーが一定期間に数回失敗する場合は、センサーに重大な問題が発生しており、オペレーターの注意が必要です。したがって、ワーカーの再起動をあきらめて、イベント ハンドラーにメッセージを送信する必要があります。ただし、スーパーバイザーのデフォルトの動作は、プロセスの再起動制限を使い果たした後に終了します。

2 つの解決策があります。

  1. スーパーバイザでプロセスのタイプを一時的に設定し、それらを制御して、制御で再起動しますgen_server。しかし、これはまさにスーパーバイザーが行うべきことなので、車輪を再発明しています。

  2. メイン スーパーバイザーの下に各ワーカーのスーパーバイザーを作成します。これは私の 2 番目の問題を正確に解決しますが、再起動後にワーカーの状態が失われるため、ワーカーの状態を格納する ets テーブルのようなストレージが必要です。

私は Erlang に非常に慣れていないので、(もしあれば) どの解決策が最適かについて、私の問題に対するアドバイスが必要です。前もって感謝します。

4

1 に答える 1

2

ワーカーがスーパーバイザーによって再起動されると、その状態が失われますが、これは私には受け入れられません。同じ状態でワーカーを再作成する必要があります。

プロセスのライフサイクルを維持するためにプロセスの状態が必要な場合は、ETS テーブルなど、別の場所に保存する必要があります。

ワーカーが特定の時間内に数回失敗する場合は、センサーに重大な問題が発生しており、オペレーターの注意が必要です。したがって、ワーカーの再起動をあきらめて、イベント ハンドラーにメッセージを送信する必要があります。ただし、スーパーバイザーのデフォルトの動作は、プロセスの再起動制限を使い果たした後に終了します。

正しい。一般的に言えば、スーパーバイザーに入れるロジックが少ないほど、優れています。スーパーバイザーは、子プロセスを監視するだけで十分です。ただし、スーパーバイザーを監視し、スーパーバイザーがあきらめたときに通知を受けることはできます (単なるアイデアです)。このようにして、車輪の再発明を回避し、スーパーバイザーを使用して子を管理できます。

于 2012-03-28T07:57:35.947 に答える