1

我正在尝试实现一种高度并发的访问模式,其中每个请求在获取时都应该获得一个唯一的文档。我不能使用N1QL,也没有密钥来获取 KV。我实现了一个文档数组,并且作为Arrays.asList(remove(0))线程安全调用,每个并行线程都应该能够删除数组的第 0 个滚动元素,确保没有 2 个线程删除相同的元素。这适用于并发线程。但是,现在的问题是,由于每个线程也想使用检索到的文档内容,我没有看到任何方法来反序列化删除的元素并读取内容。删除调用不会返回这样的元素。

任何指导/指针将不胜感激。

这是我的代码片段:

MutateInResult resultDet = collection.mutateIn("TestDoc", Arrays.asList(remove("[0]")));

谢谢 Naved

4

1 回答 1

2

此功能(返回已删除的内容)之前已请求过,并被跟踪为MB-31401。关于该问题的评论解释了为什么它不是原始设计的一部分。

在解决该问题之前,您需要lookupIn在删除它之前获取使用的值(使用lookupIn结果中的 CAS 值,并在 CAS 不匹配时重试)。中有一个这种技术的示例CouchbaseQueue.poll(),尽管该特定代码冒着在应用程序实际处理项目之前从数据库中删除项目的风险。

我不知道有一种简单的方法可以确保每个数组元素都由一个线程处理。如果您确保在删除元素之前对其进行处理,则它可能由多个线程处理。另一方面,如果您在处理之前删除元素,您可以确保它最多由一个线程处理,但如果在删除元素之后和处理之前出现应用程序故障,您可能会面临由零线程处理的风险。

于 2021-02-16T05:33:14.557 回答