私はベスト プラクティスに従い、Akka でエラー カーネル パターンを適用しようとしています。ここからのこの引用によると:
1 つのアクターが非常に重要なデータを運ぶ場合 (つまり、回避可能であればその状態が失われてはならない)、このアクターは、監督する子に潜在的に危険なサブタスクを供給し、これらの子の失敗を適切に処理する必要があります。要求の性質によっては、要求ごとに新しい子を作成するのが最善の場合があります。これにより、応答を収集するための状態管理が簡素化されます。これは、Erlang の「エラー カーネル パターン」として知られています。
... 子を作成し、エラーが発生しやすい作業を子に委任して、重要な状態を親/スーパーバイザー アクターに集中させることをお勧めします。
このシナリオで、重要な状態のアクターが何らかの理由で再起動された場合、その古い子 (再起動前に作成されたもの) からのメッセージを処理する必要がありますか?
これを例で説明しましょう。
アクターが 3 人いると仮定しましょう: A
(の親/スーパーバイザーB
)、B
(の親/スーパーバイザーC
、重要な状態を含む)、およびC
.
A
の監視戦略は、例外が発生した場合にその子を再起動するように構成されています。
C
B
のコンストラクタで作成されます。
次に、メッセージbc
がフォームB
から に送信されたとしますC
。C
処理を開始し (そこで長時間実行される計算を実行すると想像してください)、処理が完了すると、 に応答B
しcb
ます。
ここで、 before が に送信され、 send メッセージcb
によって処理されたと仮定します。このメッセージによって例外がスローされ、の監視戦略の決定が再開されます。B
A
ab
B
B
A
B
の子としての再起動B
C
中に停止しますB
( のコンストラクターで newC'
が作成されますB
)。
再起動する前に送信されたものからB
受信を再起動しますか?cb
C
B
はいの場合、sender
of cb
( C
) は restarted の子と見なされB
ますか? アクターの ref のC
とは等しいでしょうか (との名前が等しいとC'
仮定します)?C
C'