2016-12-22 4 views
1

私は長期間滞在しているWindowsサービスでakka.netのリモートアクターを使用しています。私はActorSelectionを使用してリモートアクターのIActorRefを取得し、このIActorRefを長時間アクティブに保ちます。 IActorRefは、別のWindowsサービスで実行されているアクターシステムを指します。 私は、リモートアクタを再起動しても、リモートアクタrefは無効にならないことを理解しています。ただし、リモートウィンドウサービスがある時点で再起動し、呼び出し元のWindowsサービスのIActorRefが無効になることが考えられます。古いakka.netリモートiactorrefを処理する方法

これを処理するためのベストプラクティスは何ですか? 単純なアプローチは、リモートアクタを呼び出すたびにActorSelectionを使用して新しいIActorRefを取得することです。これは明らかに非効率的である。

もう1つのアプローチは、例外をトラップし、actorselectionを使用して新しいIActorRefを取得して再試行する何らかの種類のエラー処理エンベロープで、そのIActorRefで行ったすべての呼び出しを単純にラップすることです。あるいは、エンベロープは、実際の呼び出しの前にテストコールを作成して、リモートアクタがまだ生きているかどうか、新しいアクタrefを取得していないかどうかを確認することができます。

もっと良い方法はありますか?

答えて

1

デッドアクターを検出するデフォルトオプションはWatchです(documentation参照)。ある俳優が別の俳優を見ると、俳優が死んだり、到達不能になったりすると、Terminatedというメッセージが届きます。

+0

回答ありがとうございます。これは、俳優自身の内部にないコードから遠隔の俳優にメッセージを送信するときに、どのように動作するのでしょうか。たとえば、アクター選択を使用してリモートアクターにIActorRefを取得し、Ask()を介してメッセージを送信します。呼び出し側システムにはアクター自体がないので、終了メッセージを受け取る俳優はいません。私はこの目的のためだけに俳優を作ることができると思いますが、そのような専用の俳優を作ることなくこれを達成するための他の方法はありますか? – cfcal

0

終了メッセージを見ると、リモートアクタが亡くなったことがシステムに警告されますが、終了したリモートアクタにどのくらい正確に応答するかという問題があります。アクターがそのコンストラクターを介してリモートアクターにIActorRefを取得したとすると、アクターが再びアクティブになったとき、アクターはリモートアクターへの新しいIActorRefをどのように取得しますか? 1つの方法は、アクターが失敗し、親アクターに委譲して、アクター選択を介してリモートアクターに新しいIActorRefを取得することです。しかし、この問題は、リモートアクタの元のアクタの選択が、通常、依存性注入が発生するコンポジションルート内の非アクターコードで行われた可能性があることです。あなたは、これを回避するために、アクター選択ファクトリの代理人を渡して、リモートIActorRefを再構築することができると思います。私が思いついた別の方法は、FaultTolerantActorRefというIActorRefを実装するラッパークラスを作成することです。

このクラスはコンストラクタ内のリモート(またはローカル)アクタのパスを受け取り、周期的にアクタの選択を行い、リモートアクタにIActorRefをリフレッシュします。このようにして、何らかの理由でリモートアクタが死亡した場合、FaultTolerantActorRefのコールは、リモートアクタが死んでいる間に死んだ文字になります。しかし、リモートアクターが最終的に再びオンラインになると、FaultTolerantActorRefへの呼び出しは、呼び出されたローカルアクターの部分に対して明示的なアクションをとることなく、最終的に新しく復活したリモートアクターに到達します。

FaultTolerantActorRefに次回の呼び出しで新しいアクター選択を強制するInvalidateメソッドがあります。これは、リモートアクタからのTerminatedメッセージに応答して、俳優によっておそらく呼び出される可能性があります。 Invalidateを呼び出さなくても、コンストラクタに渡されたリフレッシュ間隔に基づいて新しいアクタが選択されます。

関連する問題