0

我们想使用 Riak 的 Links 来创建一个双向链表。

我相信它的算法非常简单:

  1. 让“N0”成为要插入的新元素
  2. 获取列表的头部,包括其“下一个”链接 (N1)
  3. 将 N1 的“前一个”设置为 N0。
  4. 将 N0 的“下一个”设置为 N1
  5. 将列表头部的“下一个”设置为 N0。

我们遇到的问题是这里有一个明显的竞争条件,因为如果 2 个并发客户端获得列表的头部,其中一个项目可能会“丢失”。有什么办法可以避免吗?

4

1 回答 1

2

在谈论 CAP 定理时,Riak 是一个最终一致的系统。

如果您设置了存储桶属性allow_multi=true,如果两个并发客户端获得列表的头部然后写入,您将拥有兄弟记录。在您下次阅读时,您将收到多个值(兄弟),然后必须解决冲突并写入结果。鉴于我们没有任何类型的原子性,当您尝试更新链接对象时,这可能会在大量写入并发下导致额外的冲突。不是不可能解决,但绝对是棘手的。

您最好将整个列表序列化为单个对象。这使您的冲突解决更加简单。

于 2013-04-06T03:23:37.093 回答