2014-11-01 55 views
3

我目前在使用couchDB,有以下情况: 我正在实施问题跟踪器。要求是每个问题文件(除了文件_id外)都有一个唯一的数字序号,以便以更恰当的方式引用它。如何在CouchDB文档中插入自动递增/序列号值?

我的第一种方法是有一个视图,它只是返回当前存储的唯一问题文档的计数。将客户端的该值增加1,将其分配给我的新问题并插入该问题。 在使用ajax调用插入多个问题或让多个客户端同时添加问题时,结果不妙。在后一种情况下,如果客户之间没有沟通,甚至是不可能的。

理想情况下,我想要在沙发上生成序列号,由于分布式系统中的冲突状态,这是不可能的。

有什么好的模式,可以使用(也许在客户端)来处理?我觉得这是一种标准的用例(考虑发票号码等)。

在此先感谢!

回答

1

你可以使用一个单独的文件里面是空的,但它只是由idrev的。 rev前缀始终是一个整数,因此您可以将其用作自动递增数字。

只需对您的文档进行POST,这将增加rev并将其返回。然后,您可以将此生成的值用于您的目的。

替代方式:

创建一个单独的文件,包括valuelock。然后执行如下所示:“IF锁== true然后返回ELSE设置锁= true并将值增加1”,然后执行GET以获取新的value并最终设置lock = false

+0

这实际上是一个好主意......去尝试一下。 – Markus 2014-11-05 17:11:52

+0

不幸的是,您的第一条建议无效,因为沙发需要在更新文档时发送修订ID。这是为了确保客户端拥有最新版本的文档,所以我需要首先获取文档以获取最新版本。 – Markus 2014-11-06 07:28:54

+1

我有种替代方式。但是我没有使用文档来锁定数字的提取。相反,我使用了一些应用程序逻辑和沙发的能力来批量插入足以满足我的用例的文档。不过,我接受了你的答案,因为这似乎是正确的选择。 – Markus 2014-11-08 20:01:38

0

我同意你的观点,即使用文档数量不是一个好主意。而这正是couchdb使用uuid的原因。

我不知道在couchdb中的顺序id功能,但认为它很容易编写。我会考虑:

  • RPC(例如与RabbitMQ)调用单个服务以避免并发问题。然后,您可以将最新号码存储在特定的非分布式couchdb或其他地方的专用文档中。这可能不是特别好,但是在这成为问题之前,你正在写一个问题跟踪系统。
  • 如果您允许丢失数字,请将沙发上的uuid算法设置为顺序,并且在第一次缓冲区溢出之前您至少保持良好状态。查看更多信息在:http://couchdb.readthedocs.org/en/latest/config/misc.html#uuids-configuration