如何在最终一致性环境中保留唯一值?

时间:2014-07-17 23:31:50

标签: database-design eventual-consistency

是否有人有关于如何在最终一致的环境中进行唯一值预订的任何链接/资源?

示例:用户在注册时可以选择他们的用户名。即使两个用户同时尝试获取相同的名称,也只有一个用户应该成功。

我有几个潜在的解决方案浮在我的头上,但我想知道是否有人已经完成了这项设计的腿部工作。

3 个答案:

答案 0 :(得分:0)

当你提到用户名字段时,你提醒我一个古老的病毒式笑话,指出人类将在50年后解决的最大问题是在互联网上找到一个可用的用户名。

您在评论中提到的问题与锁定和并发插入有关,详见此处:http://dev.mysql.com/doc/refman/5.0/en/locking-issues.html

现在,据我所知,插入语句在执行之前被缓存并存储在队列中,而不管它们的到达时间是否相似。因此,自动获得唯一值(例如:用户名),而另一个获胜。但实际上,让两个用户在相同的原子时间选择相同的用户名的可能性非常非常低。即使在实验室环境中,也有许多事情需要完美地工作才能进行测试。

在另一个注释中,您可以允许两个用户在使用相同的用户名时进行注册。例如:假设您有一个用户帐户系统,您允许用户使用用户名和密码进行注册。用户名仅限于以下字符:a到z,A到Z,0到9加上特殊字符_(下划线)和。(句号)。您可以将用户名(在mysql表中定义为不唯一)与特殊字符(除了_和。)后跟一个您在mysql表中的唯一标识符(让我们说是user_id)。

当用户尝试登录时,您将其输入与所有子字符串用户名的集合进行比较(您只获取您定义的特殊字符之前的值)。将匹配记录在一个数组中,然后检查用户密码是否与找到的任何用户匹配。密码。如果确实如此,那么你就登录了,如果它没有,那么你就不会。

虽然我在实践中已经看到了上述内容,但我反对它。我会用这些用户'电子邮件而不是唯一的用户名。这是一个更简单,更清洁的解决方案,因为电子邮件是独一无二的。没有两个用户拥有相同的电子邮件帐户,除非他们共享该地址(例如地址听起来像contact@xyzcompany.com)。

答案 1 :(得分:0)

唯一性约束需要可序列化/线性化。这使得无法在不可序列化的系统中实现。 CAP意义上的所有AP系统都是不可序列化的。

模糊地定义了最终的一致性,但它几乎意味着一个不可序列化的系统。 因此,您的要求无法实现。

选择一致的数据库以获得所需的唯一性保证,并可能将该数据复制到最终一致的数据存储中。

答案 2 :(得分:0)

这是理论上很简单的问题之一。 是的,任何唯一标识符都需要一些形式的序列化。

但在现实世界中,非常易于扩展现有的唯一标识符以形成新的标识符。最明显的是您机器的公共IP地址和时间戳。任何时候都只能有一个IP地址的所有者,因此组合是唯一的。您现在只需要决定允许以时间戳的精度从一个节点创建多少条记录。

域名也具有相同的特征,但不太紧凑。但它们更容易验证,这就是为什么它们通常用于形成对象类的真正全局命名空间。