gen_server
ハードウェアセンサーからの情報を定期的に要求するワーカーが何人かいます。センサーが一時的に故障する場合がありますが、これは正常です。センサーが失敗した場合、ワーカーは例外で終了します。
simple_one_to_one
すべてのワーカーは、戦略を持つスーパーバイザーから生成されます。またgen_server
、ワーカーを開始および停止し、'DOWN'
メッセージを受信できるコントロールもあります。
だから今私は2つの問題があります:
ワーカーがスーパーバイザーによって再起動されると、その状態が失われます。これは私には受け入れられません。同じ状態でワーカーを再作成する必要があります。
ワーカーが一定期間に数回失敗する場合は、センサーに重大な問題が発生しており、オペレーターの注意が必要です。したがって、ワーカーの再起動をあきらめて、イベント ハンドラーにメッセージを送信する必要があります。ただし、スーパーバイザーのデフォルトの動作は、プロセスの再起動制限を使い果たした後に終了します。
2 つの解決策があります。
スーパーバイザでプロセスのタイプを一時的に設定し、それらを制御して、制御で再起動します
gen_server
。しかし、これはまさにスーパーバイザーが行うべきことなので、車輪を再発明しています。メイン スーパーバイザーの下に各ワーカーのスーパーバイザーを作成します。これは私の 2 番目の問題を正確に解決しますが、再起動後にワーカーの状態が失われるため、ワーカーの状態を格納する ets テーブルのようなストレージが必要です。
私は Erlang に非常に慣れていないので、(もしあれば) どの解決策が最適かについて、私の問題に対するアドバイスが必要です。前もって感謝します。