Есть ли в системе Zookeeper Watches ошибка или это ограничение теоремы CAP?
Документация Zookeeper Watches гласит:
"Клиент увидит событие наблюдения для узла, который он наблюдает, прежде чем увидит новые данные, соответствующие этому узлу". Кроме того, "поскольку часы запускаются один раз, и между получением события и отправкой нового запроса на получение часов существует задержка, вы не можете надежно видеть каждое изменение, которое происходит с узлом в ZooKeeper".
Дело в том, что нет гарантии, что вы получите уведомление о часах.
Это важно, потому что в такой системе, как Avout Clojure, вы пытаетесь имитировать программную транзакционную память Clojure по сети, используя Zookeeper. Это зависит от наличия уведомления о каждом изменении.
Теперь я пытаюсь понять, является ли это недостатком кодирования или фундаментальной проблемой информатики (то есть теорема CAP).
У меня вопрос: есть ли в системе Zookeeper Watches ошибка или это ограничение теоремы CAP?
1 ответ
Похоже, что это ограничение в способах реализации ZooKeeper, а не ограничение теоремы CAP. Существует открытый запрос на добавление функции непрерывного наблюдения в ZooKeeper: https://issues.apache.org/jira/browse/ZOOKEEPER-1416.
У etcd есть функция watch, которая использует длинный опрос. Ограничение, которое вам необходимо учитывать, заключается в том, что между получением первого длинного результата опроса и повторным опросом может произойти несколько событий. Это примерно аналогично проблеме с ZooKeeper. Однако у них есть решение:
Однако команда watch может сделать больше, чем это. Используя индекс [передавая последний индекс, который мы видели], мы можем наблюдать за командами, которые произошли в прошлом. Это полезно для гарантии того, что вы не пропустите события между командами наблюдения.
curl -L 'http://127.0.0.1:4001/v2/keys/foo?wait=true&waitIndex=7'