在网络分区期间提交的相同消息

Identical messages committed during a network partition

我正在处理分布式数据库。我所处的情况是,在修复分区期间(节点开始识别它们从中分离出来的节点),两个不同的客户端尝试提交 3 到 4 的比较和设置,并且都成功了。从逻辑上讲,这不应该是可能的,但我很好奇两者都成功返回是否存在任何功能问题。两个客户端都正确地相信最终状态是什么,并且他们发出的命令是成功的。我想不出任何严重的问题。有吗?

CAS 的 "standard" 定义(在某种程度上有这样的东西?)保证最多一个作者会看到一个特定转换的成功响应。几个依赖于此保证的示例:

// generating a unique id
while (true) {
  unique_id = read(key)
  if (compare_and_set(key, unique_id, unique_id + 1)) {
    return unique_id
  }
}

如果两个客户端都读取了 3 并成功执行了 compare_and_set(key, 3, 4),他们都会认为他们有 "claimed" 3 作为他们的唯一 ID,并且可能最终在路上发生碰撞.

// distributed leases/leader election
while (true) {
  locked_until = read(key)
  if (locked_until < now()) {
    if (compare_and_set(key, locked_until, now() + TEN_MINUTES)) {
      // I'm now the leader for ~10 minutes.
      return;
    }
  }
  sleep(TEN_MINUTES)
}

这里有类似的问题:如果两个客户端看到锁可用,并且都成功地通过 CAS 获取锁,他们会同时认为自己是领导者。