9

actorForを介してactorRefを取得したリモートアクターが生きているかどうかを確認するにはどうすればよいですか?ドキュメントへの参照をいただければ幸いです。ScalaのAkkaを使用しています。

スーパーバイザーやデスウォッチへの言及を見たことがありますが、私のユースケースにそのような重機が必要だとは感じていません。マスターが既知のパスを使用して稼働しているかどうか、およびマスターが自己紹介メッセージを送信しているかどうかをクライアントに確認してもらいたいだけです。マスターが起動していない場合は、少し待ってから再試行する必要があります。

更新2: 提案は、ピンポンアスクテストを使用して、それが生きているかどうかを確認することです。私はこれが次のようなものであると理解しています

implicit val timeout = Timeout(5 seconds)
val future = actor ? AreYouAlive
try{
    Await.result(future, timeout.duration)
}catch{
    case e:AskTimeoutException => println("It's not there: "+e)
}

ログに例外があり、現在はそこに残っていることに混乱していると思います。例えば

  • エラー:java.net.ConnectException:接続が拒否されました
  • エラー:java.nio.channels.ClosedChannelException:null

おそらくこれはまさにそれがどのように機能するかであり、私はそれらから保護しようとするのではなく、ログのエラー/警告を受け入れる必要がありますか?

4

2 に答える 2

7

メッセージを送るだけです。とにかく、メッセージを送信した後、そのマシンはナノ秒で到達不能になる可能性があります. 返信がない場合は、死んでいる可能性が高いです。ドキュメントにはこれに関する大きな章があります: http://doc.akka.io/docs/akka/2.0.1/general/message-send-semantics.html

于 2012-05-22T21:35:10.800 に答える
1

ネットワークが利用可能であると想定しないでください。私たちのアーキテクトは、分散システムの設計には 2 つの重要な概念があるといつも言っています。

彼らです:

  • タイムアウト
  • リトライ

x 時間経過してもメッセージが届かない場合、メッセージは「タイムアウト」し、メッセージを再試行できます。タイムアウトを使用すると、特定のエラーについて心配する必要はありません。メッセージの応答が失敗しただけです。高レベルの可用性を実現するには、Zookeeper などのツールを使用してクラスタリングや可用性の監視を処理することを検討してください。たとえば、ここでリーダーの選出を参照してください: http://zookeeper.apache.org/doc/trunk/recipes.html

于 2013-08-01T15:43:34.757 に答える