MongoDB: убедитесь, что данные доставляются и доставляются только один раз
У меня есть теоретическая проблема с MongoDB: у меня есть API, который читает данные из базы данных MongoDB. Мы должны убедиться, что каждый элемент в коллекции доставлен в конце концов, но только один раз после того, как он был вставлен или изменен. Таким образом, клиенту нужна самая последняя версия элементов, но только один раз мы никогда не должны отправлять элемент снова, если в нем не было изменений.
Сначала мы решили достичь этого с помощью даты: клиент отправляет дату последнего запроса, и мы доставим только те элементы, которые были созданы или изменены после этой даты. Проблема, которую я вижу, заключается в том, что мы можем пропустить элементы, если часть кластера в течение некоторого времени недоступна и не синхронизирована с остальными. Эти элементы никогда не будут доставлены (так как они были созданы после последней синхронизации, не синхронизировались с остальными, и у клиента теперь есть более новое "последнее извлеченное" время).
Так как это не сработает, я подумал о том, чтобы решить эту проблему с помощью некоторого флага ACK, который ложен при создании и имеет значение true после его отправки клиенту. После изменения он снова будет установлен в значение false. Здесь я вижу проблему, заключающуюся в том, что, если кто-то изменяет элемент, когда он в данный момент отправляется клиенту, это изменение может впоследствии отсутствовать (изменение говорит о том, что ACK=false, а после доставки - ACK=true).
Это снова, похоже, не работает должным образом, поэтому теперь я думаю о некоторой оптимистической блокировке, когда я сохраняю версию в БД и обновляю ACK=true, только если версия не изменилась с чтения на запись.
Это должно работать, но не кажется оптимальным вообще (что, если вызов падает во время записи ACK?). Поскольку это, кажется, общая проблема: что было бы лучшим решением для этого? Или MongoDB просто не подходит для работы? Возможно ли даже решить эту проблему, если вы ожидаете, что вам придется масштабировать вертикально в какой-то момент?