关于在分布式环境中RVN和使用场景的介绍4

news2024/9/20 14:32:58

简介

在前面的文档中,我们介绍了RVN的概念,通过RVN可以解决的某类问题和使用技巧,以及处理RVN的逻辑的具体实现。在本文中,我们将要介绍关于如何使用RVN解决另一种在分布式系统中常出现的问题。

问题

假设我们创建了一个service来维护某种record。我们的service允许client获取record,并且基于现有record的内容对record进行修改。举例说,假设我们的record记录了client一方的某种操作的数量。Client每完成一次操作就将service一侧的count加1。当然我们有其它的方法,但是我们现在要求count的计算部分在client一侧完成。具体来说,我们的record可以定义为:

Record {
    int ID;
    int count;
}

Service提供的API 为:

void updateRecord(Record record);

但是在分布式系统中,可能有多个client同时试图更新同一个record,这样这两个client的update就会互相覆盖,从而使最终的结果错误。例如在下图,我们数据库中保存的ID “1”的数量是10。现在有两个client同时获取了这个记录,然后同时试图将数量改为11。最终两个带有11的结果将互相覆盖,从而我们错误的保存了11,而不是12。我们将如何避免这个问题?

解决方法

这个问题同样可以使用RVN来解决。具体来说,我们在record里加入RVN,代表某条记录的版本号。对于每次更新,client都要先获取当前记录以及它的版本号,然后将版本号加1写入到update record的request里。而service端需要检查request的RVN,确保该RVN大于当前保存的保本好,最后再将该记录和RVN写入到数据库。我们详细描述该过程如下:

现在client1和client2都获取了RVN为1的记录,然后都将RVN更新为2,发送request去试图更新service一侧的数据。Service一侧的逻辑如下:

在这里我们需要特别说明几点。为了保证处理的正确性,service必须保证在处理record的过程中RVN一直是合理的,否则就可能出现两个thread都认为自己的RVN是正确的,从而仍然互相覆盖。这样我们可以使用lock住record的ID,并且在处理完record之后再unlock,来保证处理的正确性。我们也可以使用DynamoDB的condition update来达到相同的目的,具体可以参见《关于在分布式环境中RVN和使用场景的介绍3》。

在这种逻辑下,后获得锁的thread将会发现它所持有的RVN已经不是合理的RVN了,所以它会拒绝处理它持有的request,并且向client汇报这一情况(比如可以throw exception)。而client可以重新从service获得最新的RVN的record,再次尝试根据最新的记录进行更新。

问题扩展

在我们讨论的解决方案里,我们期望service和client可以遵守共同的规则在一起工作,比如期望所有的client都可以基于获取的RVN每次增加1。只有在这种情况下,我们的数据才能被维护正确。假如,我们的API是公开的API,也就是说client并不总是可信的。Client可能会破坏规则给RVN增加2或者更多来试图非法获取修改数据的规则。在这种情况下,我们可以给每一个record version生成一个UUID来代替RVN。Client必须提供当前version的UUID以获取修改当前record的资格。在每次record被改变时都生成新的UUID。

参考文档

《关于在分布式环境中RVN和使用场景的介绍1》

《关于在分布式环境中RVN和使用场景的介绍2》

《关于在分布式环境中RVN和使用场景的介绍3》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1464994.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

注意考场细节 多拿十分不香吗?

专转本考试是专科毕业生继续升学的“本科通道”,也是千千万万专科学子的第二次高考。若是因为一些细节问题,而耽误了考试,那真的很得不偿失。 1.待发卷时应该做些什么? 提早15分钟进入考场,看一看教室四周,熟悉-下陌生…

《剑指Offer》笔记题解思路技巧优化_Part_6

《剑指Offer》笔记&题解&思路&技巧&优化_Part_6 😍😍😍 相知🙌🙌🙌 相识😢😢😢 开始刷题🟡1.LCR 168. 丑数—— 丑数🟢2. LCR 16…

Vue样式绑定

1. 绑定 HTML class ①通过class名称的bool值判断样式是否被启用 <template><!--通过样式名称是否显示控制样式--><div :class"{ haveBorder: p.isBorder, haveBackground-color: p.isBackgroundcolor }">此处是样式展示区域</div><br /…

小猫咪不喝水怎么办?主食冻干、主食罐头喂养远离缺水小猫

小猫咪不喝水怎么办&#xff1f;是否可以忽视它不喝水&#xff1f;它们会不会在口渴、缺水的时候自动去找水喝呢&#xff1f;猫的祖先是来自沙漠的猫科动物&#xff0c;在沙漠中生存时几乎找不到水源&#xff0c;因此它们进化出了“低渴感”&#xff0c;同时它们的肾脏也具备了…

EventStream获得数据流,前端配置获得推送的流

如上图所示&#xff0c;请求一个接口&#xff0c;接口以数据流的方式向客户端推送数据&#xff0c;默认需要消息收集一条&#xff0c;在原来的基础上追加&#xff0c;在create-react-app生成的工程中&#xff0c;如果代理使用了中间件http-proxy-middleware&#xff0c;同时dev…

openai sora 只能根据文本生成视频?不,TA 是通用物理世界模拟器

视频生成模型作为世界模拟器 我们探索了在视频数据上进行大规模生成模型的训练。 具体来说&#xff0c;我们联合在可变持续时间、分辨率和长宽比的视频和图像上训练文本条件扩散模型。 我们利用了一个在视频和图像潜在编码的时空补丁上操作的变压器架构。 我们最大的模型So…

Qt_纯虚函数的信号和槽

简介 在C中&#xff0c;纯虚函数是一个在基类中声明但没有实现的虚函数。纯虚函数的声明以 “ 0” 结尾。纯虚函数的目的是为了提供一个接口&#xff0c;但是不提供实现。派生类必须实现纯虚函数&#xff0c;否则它也会成为一个抽象类。纯虚函数可以在基类中定义&#xff0c;也…

PNPM 批量检查和更新项目依赖

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

代码随想录算法训练营第59天 | 583.两个字符串的删除操作 72.编辑距离

两个字符串的删除操作 dp[i][j] 表示使得[0, i-1]的word1子串和[0, j-1]的word2子串相同所需要的最小步数。 递推公式&#xff1a;也是分为word1[i-1]和word2[j-1]相不相等两种情况。如果相等则不需要修改&#xff0c;dp[i][j] dp[i - 1][j - 1]。如果不相等&#xff0c;要么删…

李一舟的AI人工智能课程全部内容

科技一直都在进步&#xff0c;我们唯一能做的就是只能让自己不断地学习&#xff0c;保持终身学习&#xff0c;否则时代抛弃你&#xff0c;连招呼都不会打一个。 分享一下最近很火的某老师的AI人工智能课程及工具&#xff0c;希望对你的人工智能学习有所帮助 课程的内容网盘链接…

酷开科技丨新年新玩法!酷开系统壁纸模式给客厅“换”新

甲辰龙年即将到来&#xff0c;新年新家新气象&#xff0c;快到酷开系统壁纸模式中挑选一款喜欢的壁纸&#xff0c;为新的一年增添一份美好和喜悦吧&#xff01; 酷开科技将更多的电视新玩法带给你&#xff0c;让你的电视成为家庭中的焦点&#xff01;酷开系统壁纸模式&#xf…

在SAP生产系统里面快速地紧急修复BUG修改代码

在SAP生产系统里面快速地紧急修复BUG修改代码

RENISHAW雷尼绍双读数头系统应用分享

在精密回转运动控制中&#xff0c;大多数场合都会对系统的回转定位精度有严格的要求&#xff0c;RENISHAW雷尼绍圆光栅系统&#xff08;RESM增量和RESA绝对值&#xff09;对于回转角度的反馈测量方案能有效的解决运动控制对回转精度的需求。但是配置单个读数头的圆光栅系统的精…

flutter sliver 多种滚动组合开发指南

flutter sliver 多种滚动组合开发指南 视频 https://youtu.be/4mho1kZ_YQU https://www.bilibili.com/video/BV1WW4y1d7ZC/ 前言 有不少同学工作中遇到需要把几个不同滚动行为组件&#xff08;顶部 appBar、内容固定块、tabBar 切换、tabBarView视图、自适应高度、横向滚动&a…

PostgreSQL 实体化视图的使用

上周的教程中&#xff0c;通过 DVD Rental Database 示例&#xff0c;让我们了解了在 PostgreSQL 中创建实体化视图的过程。正如我们所了解的&#xff0c;PostgreSQL 实体化视图提供了一种强大的机制&#xff0c;通过预计算和存储查询结果集为物理表来提高查询性能。接下来的内…

广州市轻工技师学院领导一行莅临泰迪智能科技开展“访企拓岗”活动

2月21日&#xff0c;广州市轻工技师学院技能鉴定处副主任王永润、信息技术产业系副主任邝嘉伟及信息技术产业系骨干教师等一行莅临广东泰迪智能科技股份有限公司产教融合实训基地就深入“访企拓岗”、强化校企合作、促进毕业生充分就业、创新人才培养范式等领域进行了深入交流。…

美团优惠券平台的探索设计与实现

随着电子商务的不断发展&#xff0c;优惠券已经成为吸引用户、促进消费的重要手段之一。美团作为中国领先的生活服务平台&#xff0c;也推出了优惠券平台&#xff0c;为用户提供更多实惠和便捷。本文将探讨美团优惠券平台的设计与实现&#xff0c;以及其在用户消费中的作用和未…

opencv判断二值的情况

目的 先说说理论&#xff1a; 什么叫图像的二值化&#xff1f;二值化就是让图像的像素点矩阵中的每个像素点的灰度值为0&#xff08;黑色&#xff09;或者255&#xff08;白色&#xff09;&#xff0c;也就是让整个图像呈现只有黑和白的效果。在灰度化的图像中灰度值的范围为0…

Flutter插件开发指南01: 通道Channel的编写与实现

Flutter插件开发指南01: 通道Channel的编写与实现 视频 https://www.bilibili.com/video/BV1ih4y1E7E3/ 前言 本文将会通过一个加法计算&#xff0c;来实现 Channel 的双向通讯&#xff0c;让大家有个一个体会。 Flutter插件 Flutter插件是Flutter应用程序与原生平台之间的桥…

Leetcode3036. 匹配模式数组的子数组数目 II

Every day a Leetcode 题目来源&#xff1a;3036. 匹配模式数组的子数组数目 II 解法1&#xff1a;KMP 设数组 nums 的长度为 m&#xff0c;数组 pattern 的长度为 n。 遍历数组 nums 的每个长度是 n1 的子数组并计算子数组的模式&#xff0c;然后与数组 pattern 比较&…