在网络分区期间提交的相同消息
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 获取锁,他们会同时认为自己是领导者。
我正在处理分布式数据库。我所处的情况是,在修复分区期间(节点开始识别它们从中分离出来的节点),两个不同的客户端尝试提交 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 获取锁,他们会同时认为自己是领导者。