Я развернул микро-сервис на нескольких серверах, который имеет два основных источника данных:
События, полученные постоянно (24/7/365) в большом объеме (100- 1000 событий / сек c)
Операция раз в день, которая может занять мгновение до конца sh
Я хочу чтобы запустить эту обработку один раз в день в монопольном режиме: приостановите обработку событий, запустите задачу один раз в день, а затем возобновите обработку событий. У меня уже есть способ правильно запустить однократную операцию, но мне все еще нужно реализовать блокировку между 1 и 2. Чтобы обеспечить исключительность.
Большинство рецептов ZooKeeper, которые я обнаружил, требуют операции записи для каждого обработанного события например, захват блокировки чтения с InterProcessReadWriteLock
или увеличение счетчика с DistributedAtomicLong
. Поскольку ежедневные операции случаются нечасто, эти издержки для каждого события кажутся бесполезными.
Есть ли квитанция ZooKeeper / Curator, оптимизированная для такого случая использования?
Я думал о следующем, но я Я не на 100% уверен, что это правильный подход (и как реализовать пункт 2 ниже):
- Когда начинается ежедневная операция, создайте новый путь
/exclusive
в ZooKeeper - Дождитесь окончания всех событий в полете sh
- Перед обработкой события проверьте, существует ли
/exclusive
. Если он есть, прекратите обработку до тех пор, пока /exclusive
путь не будет удален - По окончании одного раза в день удалите путь
/exclusive