如何在使用Spring Scheduler时使用Couchbase时锁定文档

时间:2019-02-11 10:26:29

标签: spring-data couchbase spring-scheduled

我们有一个微服务,该微服务具有一个接受请求的端点,该端点在沙发床中创建文档并返回OK。稍后由弹簧计划程序处理文档。

我们正在使用docker部署微服务。现在,如果我们有多个应用程序实例在运行,那么我们将遇到一个问题,即每个实例将读取并处理不需要的同一文档。一次只能处理一个实例。

  1. 我们首先想到的是使用'is-scheduled'标志和乐观锁来避免其他实例对其进行处理,但是,如果某些已读取并设置了该标志的实例崩溃,我们将把is-scheduled文档永久保存为true,他们将永远不会被捡起来进行处理。
  2. 我们还考虑过使用悲观锁定,但是 couchbase sdk仅允许锁定30秒。我们不可以 确保处理在30秒内完成。
  3. 我们考虑过创建一个文档 具有相似的ID,但带TTL的不同前缀。在获取要处理的文档之前,我们将尝试获取此文档 (这是一种锁)。如果文档可用,则我们可以跳过文档处理。即使应用程序崩溃,此锁也将过期,以后可以处理该文档。到目前为止,我们尚未发现此解决方案有任何问题。

问题:

  1. 第二点,是他们在沙发上的一种方式,我们可以 文件锁定时间超过30秒(例如4小时或更长时间)。
  2. 在第三个解决方案中是否遗漏了他们的任何极端情况?
  3. 还是他们解决这个问题的更好方法?

更新: 我们继续使用第三个解决方案。它的实现非常简单,似乎可以满足我们所知道的所有情况。

1 个答案:

答案 0 :(得分:1)

您可以将文档预先指定给特定的后端处理器。创建每个文档后,在其中添加一个字段,指出应该由哪个处理器负责。