约束和唯一性保证

举报
JavaEdge 发表于 2022/08/31 23:59:01 2022/08/31
【摘要】 约束和唯一性保证DB的唯一性约束:如用户名或电子邮件地址必须唯一标识一个用户,而文件存储服务中,不能有两个具有相同路径和文件名的文件。若在写数据时强制执行此约束(如若两人同时创建一个具有相同名称的用户或文件,其中一个将返回一个错误),也需线性一致性。这种情况实际上类似于一个锁:当一个用户注册你的服务时,可以认为他们获得了所选用户名的 “锁”。该操作与原子性的比较与设置(CAS)非常相似:将用...

约束和唯一性保证

DB的唯一性约束:如用户名或电子邮件地址必须唯一标识一个用户,而文件存储服务中,不能有两个具有相同路径和文件名的文件。若在写数据时强制执行此约束(如若两人同时创建一个具有相同名称的用户或文件,其中一个将返回一个错误),也需线性一致性。

这种情况实际上类似于一个锁:当一个用户注册你的服务时,可以认为他们获得了所选用户名的 “锁”。该操作与原子性的比较与设置(CAS)非常相似:将用户名赋予声明它的用户,前提是用户名尚未被使用。

若想确保:

  • 银行账户余额永不会为负

  • 不会出售比仓库里的库存更多的物品

  • 两个人不会都预定航班同一时间的同一位置

这些约束条件都要求所有节点都同意一个最新值(如账户余额,库存水平,座位占用率)。

有时也能宽松处理这些限制(如若航班超额预订,可将客户转移到不同航班并为其提供补偿)。这时可能不需要线性一致性。

但硬性唯一约束(关系型DB的主键约束)需保证线性一致性。其他类型的约束,如外键或属性约束,可不需要线性一致性。

2.2.3 跨信道的时序依赖

注意图-1细节:若 Alice 没有惊呼得分,Bob 就不知道他的查询结果陈旧。他会在几s后刷新页面,最终看到最后分数。由于系统中存在额外信道(Alice 的声音传到 Bob 耳朵),线性一致性的违背才会被注意到。

计算机系统也有类似情况。假设用户可上传照片,有后台进程调整照片大小,降低分辨率以加快下载速度(缩略图)。该系统的架构和数据流如图-5:

图像缩放器需明确指令执行大小调整,Web服务器通过MQ发送指令。 Web服务器不会将整个照片放队列,因为大多MQ都针对较短消息而设计,而一张照片空间占用可能几M。因此,先将照片写入文件存储服务,写完后,把调整指令放入MQ。 图-5:Web服务器和图像缩放器通过文件存储和消息队列进行通信,打开竞争条件的可能性

若文件存储服务线性一致,则该系统能正常工作。若不是,则存在竞争风险:MQ图-5中的步骤3、4)可能比存储服务内部的复制更快。此时,当调整模块读取图像(步骤 5),可能看到图像旧版本或啥都没。若它处理旧版本图像,则文件存储中的全尺寸图和缩略图就产生永久不一致。

问题是 Web 服务器和缩放器之间存在两个不同信道:文件存储与MQ。没有线性一致性的最新保证,这两个信道之间存在竞争条件。这类似图-1:数据库复制通道, Alice 的嘴到 Bob 耳朵之间的真人音频信道,之间也存在竞争条件。

线性一致性也不是避免这种竞争条件的唯一方法,但最容易理解。若能控制额外信道(如MQ 案例,而不是在 Alice 和 Bob 案例),则可使用在 “读己之写” 讨论过的类似方法,不过会有额外复杂度代价。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。