[英]Akka.NET Remote between Linux and Windows
我有一個分布式的演員系統,一些在Windows上,一些在Linux機器上。 有時一個演員可能需要連接其他演員並進行一些溝通。 當然,有些情況下,其中一個在Windows上,另一個在Linux系統上。
演員通過ActorSelection相互連接。 問題是,當Windows演員試圖與Linux通信時,一切正常。 但是當Linux actor發起通信時,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
}
}
}
public-hostname是公共可用的ip地址。
所以,以下是案例:
Akka.Remote.Transport.AkkaProtocolManager |現在監督akka://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 |已啟動(Akka.Remote.Transport.ProtocolStateActor)|||| 13:20:08.3922 | DEBUG | Akka.Remote.Transport.ProtocolStateActor |停止||||
此處描述了類似日志的問題: Akka.net啟動和停止沒有活動原因是系統協議不兼容。 這是同一個問題嗎? 當我從Akka.NET文檔和發行說明中獲得它時,它具有完整的Linux支持...
那么,我在配置中遺漏了什么嗎? 任何人都可以使用Linux - > Windows連接嗎?
這里的問題似乎是由於某種原因,Mono在其綁定地址中使用映射到IPV4的IPV6地址。
阿卡://TestSystem/system/transports/akkaprotocolmanager.tcp.0/akkaProtocol-tcp%3A%2F%2FTestSystem%40%5B%3A%3Affff%3A192.168.0.252%5D%3A36983-1
如果您解碼此轉換為的URL
akkaProtocol-TCP:// @ TestSystem [:: FFFF:192.168.0.252]:36983-
所以我認為這里發生的事情是Helios應該解析的出站地址在Linux端被搞砸了,所以它試圖連接到一個與Windows監聽的地址不同的錯誤地址。 我懷疑,在actor選擇URI解析代碼中特定於平台的東西是不正確的。
我在這里提交了一個錯誤: https : //github.com/akkadotnet/akka.net/issues/2254
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.