2017-01-18 11 views
7

Мы подключаемся к внешнему кластеру Hazelcast (версия 3.7.2) с использованием клиента Java Hazelcast, но при повторном подключении возникают проблемы, если кластер не работает.Повторно подключить клиента Hazelcast

Мы создаем наш клиент с HazelcastClient.newHazelcastClient. Как только мы это сделаем, мы сохраняем копию HazelcastInstance и используем ее для взаимодействия с кластером Hazelcast (getMap, getSet и т. Д.). Мы также храним карты, наборы и т. Д., Которые мы получаем от HazelcastInstance в потенциально долгоживущих объектах. Все хорошо работает на счастливой тропе. Однако, если кластер когда-либо опускается и возвращается, мы получаем HazelcastInstanceNotActiveException при попытке доступа к этим объектам, которые были созданы до спуска кластера.

Есть ли способ автоматически восстановить соединение с клиентом, когда кластер вернется в сеть, чтобы мы могли возобновить использование объектов (карт, наборов и т. Д.), Которые мы ранее извлекли из Hazelcast, прежде чем кластер опустился ? Или нам нужно иметь дополнительный код, чтобы поймать HazelcastInstanceNotActiveException, а затем перестроить HazelcastInstance и любые объекты, которые мы сохранили в клиентском приложении? Последний кажется, что он будет довольно инвазивным и определенно нежелательным иметь дело с каждым экземпляром, в котором мы храним один из этих объектов Hazelcast.

Большинство вещей, которые я прочитал, относятся к настройкам тайм-аута подключения, предела попытки и времени ожидания попытки. В настоящее время мы используем значения по умолчанию, но они ничего не делают при доступе к объекту, который мы уже извлекли. Любой доступ к ранее существующему объекту немедленно прекращается с HazelcastInstanceNotActiveException даже после резервного копирования кластера.

Это похоже на общую проблему, с которой сталкиваются многие люди. Какова наилучшая практика для решения этой проблемы?

ответ

1

Как вы уже прочитали, задание значения попыток соединения Integer.MAX_VALUE и увеличение продолжительности между попытками выше, куда вы направляетесь.

На данный момент нет другого способа решить эту проблему. Я представляю минималистский SPI для предоставления пользовательских стратегий управления пересоединением, таких как экспоненциальное отключение, но такой вещи еще не существует.

+0

Если я увеличиваю попытки соединения с Integer.MAX_VALUE, он будет блокироваться неограниченно, пока кластер не работает. У нас довольно высокая загрузка трафика, поэтому мы не можем ставить в очередь все наши запросы, пока кластер не будет резервным. «HazelcastInstance» знает, работает ли он ('getLifecycleService(). IsRunning()'), поэтому было бы неплохо, если бы он сработал немедленно, если он не запущен, но затем постоянно пытается повторно подключиться в фоновом режиме на основе некоторой предопределенной стратегии (попробуйте каждый X количество секунд, экспоненциальное отключение и т. Д.). Возможно ли подобное? – nolt2232

+0

Пожалуйста, создайте запрос функции в github, потому что на данный момент методы предназначены для блокировки, поэтому то, о чем вы просите, имеет смысл, но является массовым изменением от текущего подхода. Возможно, вам захочется взглянуть на async ops и убить их после таймаута? – noctarius

+1

Спасибо за ваши предложения. Я отправил запрос функции здесь: https://github.com/hazelcast/hazelcast/issues/9692 – nolt2232