Инициировать диспетчер кластеров Vert.x из существующего кластера HazelCast, работающего снаружи

#docker #hazelcast #vert.x

#docker #hazelcast #vert.x

Вопрос:

Я новичок в использовании технологии Hazelcast / Vert.x.

На моем ноутбуке установлен docker desktop. С помощью docker я создал кластер Hazelcast с двумя узлами, использующими TCP-IP, и для этого я использую изображение hazelcast / hazelcast: 4.0.2.

 <multicast enabled="false"></multicast>
<tcp-ip enabled="true">
  <member>x.x.x.x:5701</member>
  <member>x.x.x.x:5702</member>
</tcp-ip>
  

Я проверил журналы службы docker для двух участников, которые показывают, что оба участника успешно созданы и присоединены без каких-либо ошибок. Кроме того, я создал JAVA-программу Hazelcast-client на своем ноутбуке с использованием IntelliJ IDE, через которую я успешно подключился к кластеру Hazelcast, который работает внутри docker.

Я застрял, когда пытаюсь использовать Vert.x Hazelcast и хочу подключить существующий кластер Hazelcast, который работает внутри docker. Согласно документации Vert.x Hazelcast не поддерживает клиент Hazelcast или smart client. Я хочу создать экземпляр Vert.x Clustermanager, который будет указывать на существующий кластер Hazelcast, работающий снаружи в docker. Я использовал метод Hazelcast.getHazelcastInstanceByName(«») внутри кода JAVA, который не нашел существующий кластер Hazelcust. На самом деле в моем существующем проекте есть модуль, который уже использует встроенный кластер Vert.x Hazelcast с одним узлом. Для обеспечения высокой доступности и развертывания с нулевым временем простоя мы хотим включить кэш Hazelcast для модуля.

Возможно ли получить существующий экземпляр hazelcast в коде JAVA. За последние несколько недель я просмотрел почти все ссылки Google, но не смог найти существующий экземпляр кластера с использованием TCP / IP. Но да, используя клиент hazelcast, я могу подключиться к внешнему кластеру, но я хочу создать экземпляр Vert.x Clustermanager, для которого требуется экземпляр Hazelcast, а не экземпляр HazelcastClient. Я специально ищу, чтобы минимизировать изменения в существующем коде.

Ответ №1:

Vertx не поддерживает клиент Hazelcast (как вы упомянули и как указано в Vertx: использование существующего кластера Hazelcast). Это означает, что вам всегда нужно запускать экземпляр Hazelcast, встроенный в ваш java-процесс Vertx.

Обратите внимание, что этот встроенный экземпляр Hazelcast используется для кластеризации Vertx. Если вы хотите использовать Hazelcast также для кэширования, вы можете настроить свой собственный кластер Hazelcast и подключиться к нему с помощью клиента Hazelcast (smart). С этим проблем нет.

Теперь, говоря о кластеризации Vertx, в зависимости от того, чего вы хотите достичь, у вас есть следующие варианты:

  1. Используйте встроенный по умолчанию Hazelcast
 ClusterManager mgr = new HazelcastClusterManager();
  

Vertx создает встроенный экземпляр Hazelcast и использует его для кластеризации.

  1. Создайте свой собственный экземпляр Hazelcast и передайте его в HazelcastClusterManager
 HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance();
ClusterManager mgr = new HazelcastClusterManager(hazelcastInstance);
  

Вы по-прежнему используете встроенный Hazelcast, но на этот раз у вас есть доступ к экземпляру Hazelcast. Таким образом, вы можете технически делать с ним все, что захотите (например, получить некоторый объект распределенной карты и поместить в него значения).

  1. Создайте встроенный Hazelcast и подключите его к другому кластеру Hazelcast

Вы можете создать отдельный кластер Hazelcast (как вы это делали с Docker).

 $ docker run --rm --network host hazelcast/hazelcast
$ docker run --rm --network host hazelcast/hazelcast
  

На самом деле это может не работать в Docker Desktop, поскольку Docker Desktop запускается на виртуальной машине, которая может не поддерживать обнаружение многоадресной рассылки. Таким образом, вы можете установить CLI Hazelcast и запустить два экземпляра Hazelcast таким образом.

 $ hz start
$ hz start
  

Затем убедитесь, что вы используете ту же версию Hazelcast в своем приложении Vertx, и при запуске вы должны увидеть, что оно подключено к существующему кластеру Hazelcast.

 Dec 30, 2020 4:30:11 PM io.vertx.core.impl.VertxImpl
WARNING: You're already on a Vert.x context, are you sure you want to create a new Vertx instance?
HTTP server started on port 8888
...
INFO: [192.168.48.112]:5703 [dev] [4.1] [192.168.48.112]:5703 is STARTING
Dec 30, 2020 4:30:20 PM com.hazelcast.internal.cluster.impl.MulticastJoiner
INFO: [192.168.48.112]:5703 [dev] [4.1] Trying to join to discovered node: [192.168.48.112]:5701
Dec 30, 2020 4:30:20 PM com.hazelcast.internal.server.tcp.TcpServerConnection
INFO: [192.168.48.112]:5703 [dev] [4.1] Initialized new cluster connection between /192.168.48.112:55121 and /192.168.48.112:5701
Dec 30, 2020 4:30:26 PM com.hazelcast.internal.server.tcp.TcpServerConnection
INFO: [192.168.48.112]:5703 [dev] [4.1] Initialized new cluster connection between /192.168.48.112:5703 and /192.168.48.112:37855
Dec 30, 2020 4:30:26 PM com.hazelcast.internal.cluster.ClusterService
INFO: [192.168.48.112]:5703 [dev] [4.1]

Members {size:3, ver:5} [
        Member [192.168.48.112]:5701 - db00aaa1-c46a-4dc1-a1a3-edd823edfaef
        Member [192.168.48.112]:5702 - 9bc4ba13-50d7-4c69-ba2d-2d5fd2e40884
        Member [192.168.48.112]:5703 - 3eb4dcf3-28de-46ef-8f08-49fe0cb1afd3 this
]
  

Комментарии:

1. Что, если я захочу использовать все свои вертикали в качестве участника lite и запущу другой отдельный модуль для hazelcast и зарегистрирую всех других участников в этом модуле (модуль Hazelcast), например: 1) hazelcast в качестве основного шлюза с двумя модулями с одним резервным и двумя размещенными сервисами, где все вертикали развернуты как в, так и длякаждый будет использовать два модуля, но вся информация о моей карте кластера должна быть в модуле hazelcast, и это позволит определить, к какому модулю он действительно должен подключаться, на основе обнаружения, загрузки и т. Д