有没有人有任何关于如何在最终一致的环境中进行独特价值保留的链接/资源?
例如:用户在注册时,可以选择他们的用户名。即使两个用户同时尝试获取相同的名称,也只有一个用户应该成功。
我已经有了几个可能的解决方案,但我想知道是否有人已经完成了这个设计的跑腿工作。
发布于 2014-07-24 21:46:20
唯一性约束要求可串行化/线性化。这使得它不可能在非序列化系统中实现。CAP意义上的所有AP系统都是不可串行化的。
最终一致性的定义是模糊的,但它几乎意味着一个不可序列化的系统。因此,您的请求不可能实现。
选择一致的数据库以获得所需的唯一性保证,并有可能将该数据复制到最终一致的数据存储中。
发布于 2018-02-16 07:35:41
这是其中一个理论上的答案非常愚蠢的问题。是的,任何唯一标识符都需要某种形式的序列化。
但在现实世界中,很容易扩展现有的唯一标识符来形成新的唯一标识符。最明显的是您的机器的公共IP地址和时间戳。在任何时候,一个IP地址只能有一个所有者,因此组合是唯一的。现在,您只需以时间戳的精度决定允许从一个节点创建多少条这样的记录。
域名也具有相同的特征,但不那么紧凑。但它们更容易验证,这就是为什么它们通常用于形成对象类的真正全局名称空间的原因。
发布于 2014-07-24 21:13:47
当您提到用户名字段时,您让我想起了一个古老的病毒式笑话: 50年后人类必须解决的最大问题是在互联网上找到可用的用户名。
您在评论中提到的问题与锁定和并发插入有关,详细信息如下:http://dev.mysql.com/doc/refman/5.0/en/locking-issues.html
现在,据我所知,insert语句在执行之前被缓存并存储在队列中,而不管它们到达的时间是否相似。因此,一个用户会自动获得唯一的值(例如:用户名),而另一个则不会。但实际上,两个用户在同一原子时间选择同一用户名的可能性非常非常低。有很多东西需要完美地工作,以便即使在实验室环境中也能进行测试。
另一方面,您可以允许两个用户在拥有相同用户名的情况下注册。例如:假设您有一个用户帐户系统,您允许用户使用用户名和密码进行注册。用户名限制为以下字符:a到z、A到Z、0到9以及特殊字符_(下划线)和.(句号)。您可以使用特殊字符(_和除外)连接用户名(在mysql表中定义为不唯一)。后面是您在mysql表中拥有的唯一标识符(假设是user_id)。
当用户尝试登录时,您将他的输入与所有子字符串用户名的集合进行比较(您只接受您定义的特殊字符之前的值)。在数组中记录匹配项,然后检查用户密码是否与找到的任何用户的密码匹配。如果是,你就让他登录,如果不是,你就不登录。
虽然我已经在实践中看到了上述情况,但我还是很反对。我会使用用户的电子邮件,而不是唯一的用户名。由于电子邮件是独一无二的,因此它是一个更简单、更干净的解决方案。没有两个用户拥有相同的电子邮件帐户,除非他们共享该地址(例如,听起来像contact@xyzcompany.com的地址)。
https://stackoverflow.com/questions/24815188
复制相似问题