У нас есть приложение 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.
Это нормально, если все сервер выполняет шаг опроса, а затем один сервер блокирует, чтобы фактически обрабатывать записи, если этого легче достичь.
Существует несколько вариантов, в том числе:
Установите auto-startup="false"
и используйте некоторый инструмент управления для мониторинга серверов и убедитесь, что работает один адаптер (вы можете использовать control-bus
или JMX для запуска/остановки адаптера.
Запустите приложение в контейнерах SpringXD; установите количество модулей для источника (содержащего адаптер mongo), и администратор XD будет убедиться, что экземпляр запущен. Он использует Zookeeper для управления состоянием.
Используйте распределенную блокировку, чтобы гарантировать, что только один экземпляр обрабатывает сообщения. Сама Spring Integration поставляется с RedisLockRegistry
для таких вещей или вы можете использовать любой механизм распределенного блокировки.
Любые предложения о том, как достичь этого?
Вы можете использовать распределенный инструмент блокировки, например Zookeeper. Другой альтернативой может стать переход от простого фиксированного триггера к структуре планирования, например Quartz, которая обеспечит выполнение задания только на одном узле.
Это нормально, если все сервер выполняет шаг опроса, а затем один сервер блокирует, чтобы фактически обрабатывать записи, если этого легче достичь.
Да, что бы я сделал. Я думаю, что это самый простой способ. См. Это сообщение, чтобы узнать, как сделать блокировку с помощью Oracle.