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

时间:2015-07-23 13:10:30

标签: database distributed-system

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

1 个答案:

答案 0 :(得分:0)

"标准" CAS的定义(在某种程度上存在这样的事情?)保证最多只有一个作者会看到特定转换的成功响应。一些依赖于此保证的示例:

// 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),那么他们都认为他们已经声称" 3作为他们独特的身份,并可能最终在路上相撞。

// 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,那么他们都认为他们同时是领导者。

相关问题