我们有一个微服务,该微服务具有一个接受请求的端点,该端点在沙发床中创建文档并返回OK。稍后由弹簧计划程序处理文档。
我们正在使用docker部署微服务。现在,如果我们有多个应用程序实例在运行,那么我们将遇到一个问题,即每个实例将读取并处理不需要的同一文档。一次只能处理一个实例。
- 我们首先想到的是使用'is-scheduled'标志和乐观锁来避免其他实例对其进行处理,但是,如果某些已读取并设置了该标志的实例崩溃,我们将把is-scheduled文档永久保存为true,他们将永远不会被捡起来进行处理。
- 我们还考虑过使用悲观锁定,但是
couchbase sdk仅允许锁定30秒。我们不可以
确保处理在30秒内完成。
- 我们考虑过创建一个文档
具有相似的ID,但带TTL的不同前缀。在获取要处理的文档之前,我们将尝试获取此文档
(这是一种锁)。如果文档可用,则我们可以跳过文档处理。即使应用程序崩溃,此锁也将过期,以后可以处理该文档。到目前为止,我们尚未发现此解决方案有任何问题。
问题:
- 第二点,是他们在沙发上的一种方式,我们可以
文件锁定时间超过30秒(例如4小时或更长时间)。
- 在第三个解决方案中是否遗漏了他们的任何极端情况?
- 还是他们解决这个问题的更好方法?
更新:
我们继续使用第三个解决方案。它的实现非常简单,似乎可以满足我们所知道的所有情况。