[英]Akka.net restart actor system termination on node quarentined
我們正在使用 Akka.net v1.4.38 開發一個集群,我們有使用 Akka.IO.TCP 與外部系統通信的種子節點,以及接收和發送消息到種子節點的多個客戶端節點。 如果客戶端節點失去與集群的通信,我們需要在該節點上重新啟動 Akka Actor 系統,因為它已被隔離。 我們創建了一個 Actor 來監聽 AssociationErrorEvent 和 ThisActorSystemQuarantinedEvent 並在收到此消息時重新啟動系統。
public class ErrorManagerActor: ReceiveActor {
public ErrorManagerActor(Action action) {
Receive<ThisActorSystemQuarantinedEvent>(m => {
action();
});
Receive<AssociationErrorEvent>(m => {
action();
});
}
}
問題是演員系統永遠不會停止並在控制台中顯示警告:
[CoordinatedShutdown (akka://xxxxx)] 協調關閉階段 [actor-system-terminate] 在 00:00:10 后超時
我們創建了一個 UnitTest 來重現該問題。
[Test]
public void TerminateSystemTest() {
var actor = Sys.ActorOf(Props.Create<ErrorManagerActor>(() => {
if (!Sys.Terminate().Wait(10000))
Assert.Fail("Unable to terminate actor system");
terminatedEvent.Set();
}));
Sys.EventStream.Subscribe(actor, typeof(AssociationErrorEvent));
Sys.EventStream.Subscribe(actor, typeof(ThisActorSystemQuarantinedEvent));
var cluster = Cluster.Get(Sys);
Sys.EventStream.Publish(new ThisActorSystemQuarantinedEvent(cluster.SelfAddress, cluster.SelfAddress));
terminatedEvent.WaitOne();
}
您的測試失敗的原因是,為了讓ActorSystem
終止,它必須首先殺死所有參與者,包括運行您的測試斷言的參與者。 因此,讓參與者在System.Terminate
上執行阻塞的Task.Wait
將導致死鎖。
要在生產系統中解決此問題,請不要等待Task
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.