Кластеризация и общие данные в Vert.x
Я разрабатываю в Vert.x(на основе Netty и Hazelcast), и я пытаюсь обмениваться данными между двумя экземплярами сервера (eache этих экземпляров на разных машинах на одном и том же языке).
Моя проблема в том, что я не знаю, как настроить сервер vert.x, чтобы они могли делиться своими параллельными картами памяти (теория говорит, что это возможно).
Я прочитал много документов с Vert.x и Hazelcast, но пока у меня пока нет результатов. (Я не знаю, как заставить vert.x загружать файлы конфигурации xml файла hazelcast).
Спасибо заранее!
Ответы
Ответ 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
, и публикует и прослушивает обновления для остального кластера и из остальной части кластера.
- Создайте приложение, чтобы вам не нужно было делиться данными таким образом.