2016-10-02 4 views
1

В моей текущей настройке я использую вариант многоадресной рассылки по умолчанию менеджера кластеров Hazelcast. Когда я связываю экземпляры моих контейнеризованных модулей Vertx (через сетевые ссылки Docker), я вижу, что они успешно создают кластер Hazelcast. Однако, когда я пытаюсь опубликовать события на шине событий из одного модуля, другой модуль не реагирует на него. Я не уверен, как сетевые настройки в кластере Hazelcast связаны с сетевыми настройками для шины событий.Как настроить шину событий Vert.x для работы в кластере контейнеров Docker?

На данный момент у меня есть следующая программная конфигурация для каждого из модулей Vert.x, каждый из которых развернут внутри контейнера докеров.

ClusterManager clusterManager = new HazelcastClusterManager(); 
VertxOptions vertxOptions = new VertxOptions() 
      .setClustered(true) 
      .setClusterManager(clusterManager); 
vertxOptions.setEventBusOptions(new EventBusOptions() 
      .setClustered(true) 
      .setClusterPublicHost("application")); 

В Vert.x Основные руководство заявляет, что я, возможно, придется настроить clusterPublicHost и clusterPublicPort автобуса событий, но я не знаю, как те относятся к общей топологии сети.

ответ

3

Один ответ здесь https://groups.google.com/d/msg/vertx/_2MzDDowMBM/nFoI_k6GAgAJ

Я вижу этот вопрос придумать много, и то, что много людей пропустить в документацию (включая меня), что событие Bus не использует менеджер кластера для отправки сообщений шины событий. То есть в вашем примере с Hazelcast в качестве менеджера кластера, у вас есть кластер Hazelcast до и правильная связь (так что ваш менеджер кластеров в порядке); Однако, автобуса событий не в состоянии общаться с вашим другом докером экземпляров из-за одного или несколько из следующих действий:

  1. Он пытается использовать неверный IP-адрес другого узла (т.е. IP из частный интерфейс на экземпляре Докер, не публично отображается один)
  2. Он пытается общаться на порт Docker не настроен для пересылки (автобус событие улавливает динамического порта, если вы не укажете один)

Что вы, девочка? d, чтобы сделать это:

  1. Расскажите VertX IP-адрес, что другие узлы должны использовать, чтобы поговорить с каждого экземпляра (с помощью -cluster-хоста [командной строки], setClusterPublicHost [VertXOptions] или «vertx.cluster. public.host " [Свойства системы])
  2. Скажите Vertx явно порт, который будет использоваться для связи по шине событий, и убедитесь, что Docker перенаправляет трафик для этих портов (используя « vertx.cluster.public.port »[Свойство системы ], setClusterPublicPort [VertXOptions] или -cluster-port [параметры командной строки]). В прошлом, Я использовал 15701, потому что его легко запомнить (только «1» из портов Hazelcast).

Шина Event использует только менеджер кластера для управления IP/Port информации о других экземплярах VertX и регистрацией потребителей/производителей. Коммуникации выполняются независимо от менеджера кластера , поэтому вы можете настроить диспетчер кластеров правильно и обмениваться сообщениями, но по-прежнему не имеют сообщений о связи .

Возможно, вам не нужно выполнять оба вышеуказанных действия, если оба контейнера работают на одном хосте, но вы обязательно приступите к запуску , запуская их на разных хостах.

Что-то, что также может случиться, заключается в том, что vert.x использует интерфейс loopback, если не указывать IP-адрес, который vert.x (а не карусель) должен принимать для связи через eventbus. Проблема здесь в том, что вы не знаете, какой интерфейс берется для связи (loopback, интерфейс с IP, вы даже можете иметь несколько интерфейсов с IP).

Чтобы преодолеть эту проблему, я написал метод однажды https://github.com/swisspush/vertx-cluster-watchdog/blob/master/src/main/java/org/swisspush/vertx/cluster/ClusterWatchdogRunner.java#L101

0

менеджер кластера работает нормально, конфигурации менеджера кластера должен быть одинаковым на каждом узле (машина/Докер контейнер) в кластере или нет создавать любые конфигурации (используйте конфигурацию менеджера кластера по умолчанию).

Необходимо, чтобы конфигурация шины событий была последовательной на каждом узле, вы должны установить хост кластера на каждом узле как IP-адрес этого узла и любого произвольного номера порта (если вы не попытаетесь запустить больше, чем Vert .x на том же узле вам нужно выбрать другой номер порта для каждого экземпляра Vert.x).

Например, если IP-адрес Узла является 192.168.1.12, то вы могли бы сделать следующее:

VertxOptions options = new VertxOptions() 
       .setClustered(true) 
       .setClusterHost("192.168.1.12") // node ip 
       .setClusterPort(17001) // any arbitrary port but make sure no other Vert.x instances using same port on the same node 
       .setClusterManager(clusterManager); 

на другой узел, чей IP-адрес 192.168.1.56, то вы могли бы сделать следующее:

VertxOptions options = new VertxOptions() 
       .setClustered(true) 
       .setClusterHost("192.168.1.56") // other node ip 
       .setClusterPort(17001) // it is ok because this is a different node 
       .setClusterManager(clusterManager);