Акка за HAProxy

У меня есть 2 системы: система 1 запускает akka и HAProxy, система 2 запускает компоненты REST, которые делают запрос к akka.

Akka работает на порту 4241 в системе 1. Система 2 может подключаться к системе 1 при отсутствии HAProxy. После того, как я установил HAProxy в системе 1, запрос от системы 2 к системе 1 выдает ошибки со следующими журналами:

ОШИБКА [deal-akka.actor.default-dispatcher-18] EndpointWriter - удаление сообщения [класс akka.actor.ActorSelectionMessage] для нелокального получателя [Actor [akka.tcp: // akkaSystemName @ Server1IP: 42431 /]], прибывшего на [akka.tcp: // akkaSystemName @ Server1IP: 42431] входящие адреса: [akka.tcp: // akkaSystemName @ Server1IP: 4241]

HAProxy работает на 42431.

Конфигурация HAProxy следующая:

listen akka_tcp :42431
        mode tcp
        option tcplog
        balance leastconn

        server test1 Server1IP:4241 check
        server test2 Server1IP:4241 check

Конфигурация акка такова:

  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
    }
  }

Любое предложение будет оценено.


person Vishal Sinha    schedule 20.09.2015    source источник


Ответы (1)


Обновленный ответ:

Вероятно, Akka Remoting не должен работать с балансировщиком нагрузки. Взгляните на эту часть его документации :

Akka Remoting - это коммуникационный модуль для однорангового соединения систем акторов, который является основой для кластеризации Akka. Дизайн удаленного взаимодействия определяется двумя (связанными) проектными решениями:

1. Связь между задействованными системами симметрична: если система A может подключаться к системе B, то система B также должна иметь возможность подключаться к системе A независимо.

2. Роль взаимодействующих систем симметрична в отношении шаблонов соединений: нет системы, которая только принимает соединения, и нет системы, которая только инициирует соединения.

Следствием этих решений является то, что невозможно безопасно создавать чистые настройки клиент-сервер с предопределенными ролями (нарушает предположение 2) и с использованием настроек, включающих преобразование сетевых адресов или балансировщики нагрузки (нарушает предположение 1).

Для настройки клиент-сервер лучше использовать HTTP или Akka I / O.

В вашем случае кажется разумным использовать Akka HTTP или Akka I / O в системе 1 для приема и ответа на запросы от системы 2.


Старый ответ:

Вы должны установить свойство bind-port в конфигурации Akka. Вот цитата из документации Akka:

# Use this setting to bind a network interface to a different port
# than remoting protocol expects messages at. This may be used
# when running akka nodes in a separated networks (under NATs or docker containers).
# Use 0 if you want a random available port. Examples:
#
# akka.remote.netty.tcp.port = 2552
# akka.remote.netty.tcp.bind-port = 2553
# Network interface will be bound to the 2553 port, but remoting protocol will
# expect messages sent to port 2552.

Для ваших портов это должно быть так:

port = 42431
bind-port = 4241
person Denis Iskhakov    schedule 21.09.2015
comment
Нет, это не работает. система 1 не запускается на порту 42431. В нем говорится, что порт уже используется. В приведенном выше случае с помощью haproxy.BTW я использую akka 2.3.14. - person Vishal Sinha; 22.09.2015
comment
Да, опция bind-port отсутствует в версии 2.3.14. Но, вероятно, вам это не поможет. Посмотрите мой обновленный ответ выше. - person Denis Iskhakov; 23.09.2015