0

私のプロジェクトには 2 つの部分が含まれています。1 つは akka server で、もう 1 つは play フレームワークです。どちらも時々再起動できます。akkaサーバーからログを受信するために、Websocketハンドラーを使用しています

  def ws = WebSocket.acceptWithActor[JsValue, JsValue] { request => out =>
    CheckerActor.props(out)
  }

一部のリモート アクターの変更をサブスクライブするアクターと。

class CheckerActor(out: ActorRef) extends Actor {
...
  override def preStart() = {
    context.actorSelection("akka.tcp://Sys@127.0.0.1:2553/user/logger") ! Subscribe()
  }

  override def postStop() {
    context.actorSelection("akka.tcp://Sys@127.0.0.1:2553/user/logger") ! Unsubscribe()
  }

  def receive = {
    case msg: LogMessage => out ! Json.toJson(msg)
...
  }
}

リモート ロガー アクターは、subscribe() unsubscribe() イベントに反応し、サブスクライブしたクライアントにログ メッセージを送信します。リモートサーバーがハングアップしないか、再起動するまでは正常に動作します。リモート akka サーバーが接続を切断したことを検出する最も安価な方法は何ですか (その後、新しく開始したロガーに再度サブスクリプションを作成できます)。ピンガーアクターを構築できます。タイムアウトを受け取った場合は、再サブスクリプションを再度試みますが、単純なpingでは、それらの間で再起動が発生したことを保証できず、システムがより複雑になります。他の解決策が存在する可能性があります。

4

1 に答える 1

2

ローカル アクターを見るのと同じ方法で、リモート アクターを見ることができます。内部的には、Akka はハートビート メッセージを使用して終了をチェックします。これは、「ping」のアイデアに似ていると思います。

メッセージをリッスンするTerminatedと、リモート アクターの障害のイベントがカバーされますが、これが切断イベントをカバーするかどうかはわかりません。そのために、 に登録できますDisassociatedEvent

Akka ドキュメントの Remote Events セクションを見てください: http://doc.akka.io/docs/akka/snapshot/scala/remoting.html

于 2015-11-27T17:50:05.953 に答える