簡體   English   中英

Akka.net 在被隔離的節點上重新啟動參與者系統終止

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM