1

私はベスト プラクティスに従い、Akka でエラー カーネル パターンを適用しようとしています。ここからのこの引用によると:

1 つのアクターが非常に重要なデータを運ぶ場合 (つまり、回避可能であればその状態が失われてはならない)、このアクターは、監督する子に潜在的に危険なサブタスクを供給し、これらの子の失敗を適切に処理する必要があります。要求の性質によっては、要求ごとに新しい子を作成するのが最善の場合があります。これにより、応答を収集するための状態管理が簡素化されます。これは、Erlang の「エラー カーネル パターン」として知られています。

... 子を作成し、エラーが発生しやすい作業を子に委任して、重要な状態を親/スーパーバイザー アクターに集中させることをお勧めします。

このシナリオで、重要な状態のアクターが何らかの理由で再起動された場合、その古い子 (再起動前に作成されたもの) からのメッセージを処理する必要がありますか?

これを例で説明しましょう。

アクターが 3 人いると仮定しましょう: A(の親/スーパーバイザーB)、B(の親/スーパーバイザーC、重要な状態を含む)、およびC.

Aの監視戦略は、例外が発生した場合にその子を再起動するように構成されています。

CBのコンストラクタで作成されます。

次に、メッセージbcがフォームBから に送信されたとしますCC処理を開始し (そこで長時間実行される計算を実行すると想像してください)、処理が完了すると、 に応答Bcbます。

ここで、 before が に送信され、 send メッセージcbによって処理されたと仮定します。このメッセージによって例外がスローされ、の監視戦略の決定が再開されます。B AabBBAB

の子としての再起動B C中に停止しますB( のコンストラクターで newC'が作成されますB)。

再起動する前に送信されたものからB受信を再起動しますか?cbCB

はいの場合、senderof cb( C) は restarted の子と見なされBますか? アクターの ref のCとは等しいでしょうか (との名前が等しいとC'仮定します)?CC'

4

2 に答える 2

0

あなたの質問には矛盾が含まれています:

「ここで、cb が B に送信され、B によって処理される前に、B が再起動され、B が再起動される前に送信された C から cb を受信すると仮定します」

それで、それはどれですか?cb再起動前に送信されたかどうか

メッセージを送信する前に C が再起動すると、メッセージは失われます。再起動前に送信されたが、B によって処理されていない場合は、B のメールボックスにあり、B の新しいインスタンスが受信します。

基本的には、ひとつのメッセージが失われるとすぐにバラバラにならないようなフローを設計することをお勧めします。Akka を使用する場合、メッセージはいつでも失われる可能性があると常に想定する必要があります。

編集: 2 番目の質問を忘れました: 再起動前に cb が送信され、B が実際にそれを受信した場合、送信者はActorRefC の新しいインスタンスを指します。sActorRefActors は 2 つの異なるエンティティです。

于 2014-09-29T12:50:54.203 に答える