Tcp 哈普洛西背后的阿克卡

Tcp 哈普洛西背后的阿克卡,tcp,akka,haproxy,akka-cluster,Tcp,Akka,Haproxy,Akka Cluster,我有两个系统:系统1运行akka和HAProxy,系统2运行向akka发出请求的REST组件 Akka在系统1的端口4241上运行。当没有HAProxy时,系统2能够连接到系统1。在系统1上安装HAProxy后,从系统2到系统1的请求出错,日志如下: 错误[deal akka.actor.default-dispatcher-18]EndpointWriter-正在删除 非本地的消息[类akka.actor.actorSelectMessage] 接受者[演员]。tcp://akkaSystem

我有两个系统:系统1运行akka和HAProxy,系统2运行向akka发出请求的REST组件

Akka在系统1的端口4241上运行。当没有HAProxy时,系统2能够连接到系统1。在系统1上安装HAProxy后,从系统2到系统1的请求出错,日志如下:

错误[deal akka.actor.default-dispatcher-18]EndpointWriter-正在删除 非本地的消息[类akka.actor.actorSelectMessage] 接受者[演员]。tcp://akkaSystemName@服务器1IP:42431/]]到达 [阿卡。tcp://akkaSystemName@Server1IP:42431]入站地址为 [阿卡。tcp://akkaSystemName@服务器1IP:4241]

HAProxy在42431上运行

HAProxy配置如下所示:

listen akka_tcp :42431
        mode tcp
        option tcplog
        balance leastconn

        server test1 Server1IP:4241 check
        server test2 Server1IP:4241 check
akka配置如下:

  actor {
    provider = "akka.remote.RemoteActorRefProvider"
  }

  remote {
    netty.tcp {

      hostname = "Server1IP"

      port = 4241

      transport-protocol = tcp

      # Sets the send buffer size of the Sockets,
      # set to 0b for platform default
      send-buffer-size = 52428800b

      # Sets the receive buffer size of the Sockets,
      # set to 0b for platform default
      receive-buffer-size = 52428800b

      maximum-frame-size = 52428800b
    }
  }
如有任何建议,将不胜感激

更新答案: 也许Akka远程处理不应该与负载平衡器一起工作。看看它的这一部分:

Akka Remoting是一个用于连接参与者系统的通信模块 以点对点的方式,它是阿卡的基础。 集群。远程处理的设计由两个(相关的)设计驱动 决定:

1.相关系统之间的通信是对称的:如果系统a可以连接到系统B,那么系统B也必须能够连接 独立地建立一个系统

2.就连接模式而言,通信系统的作用是对称的:没有只接受连接的系统, 而且没有一个系统只启动连接

这些决定的结果是不可能 使用预定义的角色安全地创建纯客户端-服务器设置 (2)并使用涉及网络地址的设置 转换或负载平衡器(违反假设1)

对于客户机-服务器设置,最好使用HTTP或Akka I/O

对于您的情况,在system 1上使用Akka HTTP或Akka I/O来接受和回答system 2的请求似乎是合理的


旧答案: 您必须在Akka配置中设置
bind port
属性。以下是引自:

对于您的端口,它应该是这样的:

port = 42431
bind-port = 4241

不,它不起作用。系统1未在端口42431上启动。它说这个端口已经被使用了。在haproxy.BTW的上述案例中,我使用的是akka 2.3.14。是的,
bind port
选项在版本2.3.14中不存在。但这可能对你没有帮助。看看我上面更新的答案。
port = 42431
bind-port = 4241