Передача одиночной записи между кластером gemfire WAN

У меня есть два кластера gemfire (версия 8.2) (отправитель и получатель), подключенные через WAN. Кластер отправителя получает данные из БД и передает записи получателю через шлюз WAN, пока оба кластера не будут подключены к сети. Иногда несколько узлов кеша из кластера Receiver выходят из строя из-за проблем со средой, которые вызывают потерю данных в кластере Receiver и влияют на моих подключенных к нему клиентов. Мы используем gemfire-toolkit для передачи всех данных от отправителя к получателю в случае почти все данные отсутствуют, но это решение не подходит, если в кластере Receiver мало данных.

У меня есть требование, чтобы, если мой клиент, подключенный к кластеру получателя, ищет запись, которая недоступна в кеше, я хочу загрузить эту запись из кластера отправителя на лету. Также я не могу полагаться на шлюз-отправитель, поскольку он будет передавать данные асинхронно в соответствии с настроенным интервалом времени пакетной обработки.

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

Могу ли я как-нибудь попросить кластер отправителя передать требуемую запись получателю синхронно или немедленно, не подвергая какой-либо веб-службе. Или есть какое-нибудь другое лучшее решение, которое кто-нибудь может предложить мне изучить?


person sanit    schedule 08.03.2019    source источник


Ответы (1)


Судя по вашему описанию, вы можете легко узнать точно, какие записи отсутствуют в принимающем кластере ... в этом случае самым простым решением было бы просто "прикоснуться" (region.get() followed region.put() без изменения значения) этих записей в передающем кластере.

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

Надеюсь это поможет. Ваше здоровье.

person Juan Ramos    schedule 08.03.2019
comment
Верно, у меня есть ключ, который отсутствует, но проблема в том, как мне вызвать get (), а затем put () в кластере Sender. Как и в случае с gemtouch, я могу зарегистрировать функцию в кластере Sender, которая будет выполнять get (); put (), но мой кластер Receiver не может вызывать эту функцию, поскольку он должен подключаться к Sender в качестве клиента, но сам Receiver является еще одним независимым кластером серверов и gemfire имеет ограничение, при котором виртуальная машина не может быть одновременно клиентом и сервером. - person sanit; 09.03.2019
comment
Здравствуйте, Санит, я пропустил эту часть требования, извините за это ... Я не знаю, как это сделать из коробки. Однако подход REST кажется выполнимым, просто имейте в виду, что CacheLoader синхронно вызывается участником при промахе кеша, поэтому вам следует проявлять особую осторожность в отношении тайм-аутов при вызове конечной точки REST и рабочей нагрузки кластера. - person Juan Ramos; 11.03.2019
comment
В качестве побочного примечания, GemFire ​​поставляется с REST API из коробки, поэтому вы можете использовать его вместо того, чтобы реализовывать свой собственный, вы можете взглянуть на Разработка приложений REST для Pivotal GemFire ​​. - person Juan Ramos; 11.03.2019