我有一個分佈式系統的演員,一些在Windows上,一些在Linux機器上。有時候一個演員可能需要連接其他演員並進行一些溝通。當然,有些情況下,其中一個在Windows上,另一個在Linux系統上。Linux和Windows之間的Akka.NET遠程
參與者通過ActorSelection彼此連接。有問題的是,當Windows角色試圖與Linux通信時,所有工作都很好。但是當Linux角色啓動通信時,ActorSelection.ResolveOne失敗。
我做了一個小樣本的位置:
static void Main(string[] args)
{
ActorSystem system = ActorSystem.Create("TestSystem");
system.ActorOf(Props.Create(() => new ConnectActor()), "test");
while (true)
{
var address = Console.ReadLine();
if (string.IsNullOrEmpty(address))
{
system.Terminate();
return;
}
var remoteAddress = $"akka.tcp://{system.Name}@{address}/user/test";
try
{
var actor = system.ActorSelection(remoteAddress).ResolveOne(TimeSpan.FromMilliseconds(5000)).Result;
Console.WriteLine("Resolved: " + actor.Path);
}
catch (Exception ex)
{
Console.WriteLine("Failed: " + ex.Message);
}
}
}
配置中的app.config如下:
akka {
loggers = ["Akka.Logger.NLog.NLogLogger, Akka.Logger.NLog"]
suppress-json-serializer-warning = on
loglevel = "DEBUG"
log-config-on-start = on
actor {
provider = "Akka.Remote.RemoteActorRefProvider, Akka.Remote"
debug {
receive = on
autoreceive = on
lifecycle = on
event-stream = on
unhandled = on
}
}
remote {
log-remote-lifecycle-events = DEBUG
log-received-messages = on
helios.tcp {
transport-class = "Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote"
transport-protocol = tcp
applied-adapters = []
port = 9000
hostname = "0.0.0.0"
public-hostname = "192.168.0.251" // This is different for different hosts, of course
}
}
}
公衆主機名是公開可用的IP地址。
所以,這裏的情況:
- 當運行Windows/Windows中,這兩種情況下看到對方(我給他們的遠程地址 - 他們輸出 「已解決」)
- 當運行Windows/Linux的,並給windows演員的linux演員的地址,它輸出「已解決」。所以Windows連接linux沒有問題。之後給windows的演員的地址給linux的演員也給了「已解決」 - 我想,連接已經建立,並且沒有真正的握手通過
- 但是當運行Windiws/Linux並且給windows演員的地址給linux演員時, 「失敗」。沒有關於任何錯誤或丟棄包的消息。在日誌的末尾有以下幾點:
Akka.Remote.Transport.AkkaProtocolManager |現在監督阿卡://TestSystem/system/transports/akkaprotocolmanager.tcp.0/akkaProtocol-tcp%3A %2F%2FTestSystem%40%5B%3A%3Affff%3A192.168.0.252%5D%3A36983-1 |||| 13:20:08.3766 | DEBUGAkka.Remote.Transport.ProtocolStateActor | Started(Akka.Remote.Transport.ProtocolStateActor)|||| 13:20:08.3922 | DEBUG | Akka.Remote.Transport.ProtocolStateActor |停止||||
問題類似日誌這裏描述:Akka.net starting and stopping with no activity 究其原因,該系統的協議不兼容。這是同一個問題嗎?正如我從Akka.NET文檔和發行說明中得到的,它具有完整的Linux支持...
所以,我在配置中丟失了什麼?任何人都可以使這個示例與Linux - > Windows連接一起工作嗎?