У нас есть микросервис, который имеет конечную точку, которая принимает запрос, создает документ в couchbase и возвращает OK.Позднее документ обрабатывается планировщиком пружин.
Мы используем докер для развертывания микросервиса.Теперь, если у нас запущено более одного экземпляра приложения, возникает проблема, когда каждый экземпляр будет читать и обрабатывать один и тот же документ, который не требуется.Одновременно только один экземпляр должен обрабатывать документ.
- Сначала мы подумали об использовании флага «is-запланировано» и оптимистической блокировки, чтобы избежать обработки его другими экземплярами, однако, если какой-то экземпляр, который прочитал и установил флаг, вылетает, у нас будут документы- запланировано как истинное навсегда, и они никогда не будут забраны для обработки.
- Мы также думали об использовании пессимистической блокировки, однако sdk couchbase позволяет блокировать только в течение 30 секунд.Мы не можем гарантировать, что обработка завершится за 30 секунд.
- Мы думали о создании документа с аналогичным идентификатором, но с другим префиксом с TTL.Прежде чем получить документ для обработки, мы попытаемся получить этот документ (что-то вроде блокировки).Если документ доступен, значит, мы можем пропустить обработку документов.Даже в случае сбоя приложения срок действия этой блокировки истечет, и документ можно будет обработать позже.До сих пор мы не нашли никаких проблем с этим решением.
Вопросы:
- Во-вторых, это их путь в кресло, где мы можем получить замокна документе более 30 секунд, скажем, 4 часа и более.
- В 3-м решении пропущен любой их угловой случай?
- Или это лучший способ решить эту проблему?
Обновление: Мы пошли дальше с третьим решением.Его было очень просто реализовать и, похоже, он удовлетворяет всем известным нам случаям.