Подтвердить что ты не робот

Кластеризация и общие данные в Vert.x

Я разрабатываю в Vert.x(на основе Netty и Hazelcast), и я пытаюсь обмениваться данными между двумя экземплярами сервера (eache этих экземпляров на разных машинах на одном и том же языке).

Моя проблема в том, что я не знаю, как настроить сервер vert.x, чтобы они могли делиться своими параллельными картами памяти (теория говорит, что это возможно).

Я прочитал много документов с Vert.x и Hazelcast, но пока у меня пока нет результатов. (Я не знаю, как заставить vert.x загружать файлы конфигурации xml файла hazelcast).

Спасибо заранее!

4b9b3361

Ответ 1

Существуют опции для обмена данными между экземплярами vertx на разных машинах

Вариант 1.

Вы можете использовать Vert.x ClusterManager и он отображает:

ClusterManager clusterManager = ((VertxInternal)vertx).clusterManager();
Map map = clusterManager.getSyncMap("mapName"); // shared distributed map

Эта карта поддерживается Hazelcast IMap и распространяется. Предполагается, что вы используете vertx с параметром -cluster и настроили кластеризацию.

Однако обратите внимание, что это внутренний API и обычно не рекомендуется для производства. Если вы делаете одноразовый эксперимент, тогда это может быть полезно.

Вариант 2.

Вы можете получить доступ к Hazelcast, когда vertx запускается в кластерном режиме:

    Set<HazelcastInstance> instances = Hazelcast.getAllHazelcastInstances();
    HazelcastInstance hz = instances.stream().findFirst().get();
    Map map = hz.getMap("mapName"); // shared distributed map

Ответ 2

Afaik вы не можете обмениваться данными между разными экземплярами vert.x - из документации

"[...] Такой вариант использования лучше решается путем предоставления общей структуры карты, к которой можно получить доступ непосредственно разными экземплярами вертикали в том же экземпляре vert.x."

Так как "экземпляр vert.x" означает "jvm instance", вы не можете использовать sharedmap/set между разными jvm. Вы можете использовать для этого шину событий.

Ответ 3

Vert.x 2 не поддерживает общие данные кластера. Однако Vert.x 3 предоставляет асинхронный API, который обертывает базовый менеджер кластеров Hazelcast.

Для Vert.x 2 вы можете использовать экземпляр Hazelcast непосредственно в ваших рабочих вертикалях. Просто используйте статические методы Hazelcast для получения экземпляра Vert.x Hazelcast:

HazelcastInstance hazelcast = Hazelcast.getAllHazelcastInstances().iterator().next();

Обратите внимание, что вы должны обращаться к API Hazelcast непосредственно таким образом изнутри рабочей вертикали. API Hazelcast блокируется, поэтому он блокирует цикл события, если он используется в нормальной вертикали.

Ответ 4

С Vert.x 3 - если вы сконфигурируете свои экземпляры Vert.x в "кластерный режим" (который может быть таким же простым, как добавление -cluster в командную строку пусковой установки Vert.x, подробнее см. здесь), то вы можете использовать SharedData интерфейс для получить доступ к "распределенным картам", который позволяет членам кластера прозрачно считывать и записывать данные через кластер.

Пример:

if (vertx.isClustered()) {
    log.info("Using clustered data store");
    vertx.sharedData().<String, MyEntity>getClusterWideMap("entities", 
            res -> {
                AsyncMap<String, MyEntity> dataMap = res.result();
                setDataStore(dataMap);
            });
}

Ответ 5

Как уже отмечалось, объекты совместного использования данных в Vert.x не поддерживают обмен данными между несколькими экземплярами Vert.x. Для этого вам также нужно будет:

  • Используйте обычную общую базу данных.
  • Настройте Verticle, который управляет экземплярами SharedMap, и публикует и прослушивает обновления для остального кластера и из остальной части кластера.
  • Создайте приложение, чтобы вам не нужно было делиться данными таким образом.