Spring Integration опрашивает адаптер входящего канала на нескольких серверах

1

У нас есть приложение Spring Integration, которое производит опрос mongodb:inbound-channel-adapter следующим образом:

<int-mongodb:inbound-channel-adapter channel="n2s.mongoResults"
                                     collection-name="entities"
                                     query="{_id: {$regex: 'mpl/objectives'}})">
    <!-- Run every 15 minutes -->
    <int:poller fixed-rate="900000"/>
</int-mongodb:inbound-channel-adapter>

Все работает нормально. Однако это приложение развертывается в кластере, и поэтому на нескольких серверах работает один и тот же poller. Мы хотели бы координировать эти серверы так, чтобы выполнялся только один конвейер.

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

Заметки:

У нас есть доступ к базе данных MongoDB и базе данных Oracle в этом рабочем процессе. С точки зрения рабочего процесса имеет смысл блокировать базу данных Oracle.

Это нормально, если все сервер выполняет шаг опроса, а затем один сервер блокирует, чтобы фактически обрабатывать записи, если этого легче достичь.

Теги:
spring
spring-integration

2 ответа

0

Существует несколько вариантов, в том числе:

Установите auto-startup="false" и используйте некоторый инструмент управления для мониторинга серверов и убедитесь, что работает один адаптер (вы можете использовать control-bus или JMX для запуска/остановки адаптера.

Запустите приложение в контейнерах SpringXD; установите количество модулей для источника (содержащего адаптер mongo), и администратор XD будет убедиться, что экземпляр запущен. Он использует Zookeeper для управления состоянием.

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

0

Любые предложения о том, как достичь этого?

Вы можете использовать распределенный инструмент блокировки, например Zookeeper. Другой альтернативой может стать переход от простого фиксированного триггера к структуре планирования, например Quartz, которая обеспечит выполнение задания только на одном узле.

Это нормально, если все сервер выполняет шаг опроса, а затем один сервер блокирует, чтобы фактически обрабатывать записи, если этого легче достичь.

Да, что бы я сделал. Я думаю, что это самый простой способ. См. Это сообщение, чтобы узнать, как сделать блокировку с помощью Oracle.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню