【发布时间】:2016-06-09 14:03:28
【问题描述】:
在 Riak KV 中使用标志时,标志需要上下文。在 Elixir 客户端中,上下文由 Flag.new("my context") 设置,否则当尝试禁用标志时会抛出 :context_required。
现在,flag只能存在于一个Map中,而且map中的每个元素都必须有一个key,所以多个flag可以在一个Map中,仍然可以通过key来区分。
如果不区分它们,上下文的目的是什么?
【问题讨论】:
在 Riak KV 中使用标志时,标志需要上下文。在 Elixir 客户端中,上下文由 Flag.new("my context") 设置,否则当尝试禁用标志时会抛出 :context_required。
现在,flag只能存在于一个Map中,而且map中的每个元素都必须有一个key,所以多个flag可以在一个Map中,仍然可以通过key来区分。
如果不区分它们,上下文的目的是什么?
【问题讨论】:
地图中的标志具有“添加胜利”或“真正胜利”的语义。这种语义是使用从 Observed-Remove CRDT Set 借用的一种称为“Observed Remove”的因果关系技术来实现的。在许多方面,Flag 只是单个空元素的集合,它要么在集合中(标志为真),要么不在集合中(标志为假)。
标志底部值为 False。当 Map 中没有 Flag 的 key 时,Flag 为 false。这就是为什么您不能添加具有 False 值的标志键的原因。添加密钥与将Flag设置为True相同。
添加标志会使键获得一个点或因果标记。如果该标志同时添加两次,它将有两个这样的因果标签。当标志设置为 False 时,上下文或要删除的因果标签必须传递给 Riak,这可确保在删除 tag1 和 tag2 时某些并发设置为 True(带有 tag3)不会被设置为 false。这就是添加获胜的方式! Observed-Remove 部分由上下文促进:上下文说明您观察到了哪些因果标签,因此您可以删除哪些标签。
【讨论】: