当前位置:网站首页>最后写入胜利(丢弃并发写入)
最后写入胜利(丢弃并发写入)
2022-07-31 16:31:00 【华为云】
实现最终收敛的一种方案,每个副本总存储最新值,允许覆盖并抛弃旧值。假定每个写请求都最终同步到所有副本,只要确定哪个写入是最新,则副本就能最终收敛到相同值。
但如何定义最新?图-12中,当客户端向数据库节点发送写入请求时,客户端都不知道另一个客户端,因此不清楚哪个先发生。争辩哪个先发生其实没有大意义, 我们说支持写入并发,也就意味着它们的顺序不确定。
即使无法确定写请求的“自然顺序”,我们也能强制任意排序。如为每个写请求附加一个时间戳,然后选择最新即最大的时间戳,丢弃较早时间戳的写入。这就是最后写入胜利(LWW, last write wins),Cassandra唯一支持的冲突解决方法。
LWW实现了最终收敛目标,但以牺牲持久性为代价:若同一K有多个并发写,即使它们都给客户端通知成功(因为完成了写入w个副本),但最好也只有一个写入能存活,其他的将被静默丢弃。LWW甚至可能删除那些非并发写。
一些场景如缓存系统,覆盖写是能接受的。若覆盖、丢失数据不可接受,则LWW不是好选择。
要确保LWW安全的唯一方法:只写入一次,然后视为不可变,避免对同一K进行并发更新。如Cassandra推荐使用UUID作为K,这样每个写操作提供一个唯一K。
Happens-before关系和并发“此前发生”的关系和并发
如何判断两个操作是否并发?
案例
如下图,两个写入非并发:A的插入先于B的增量修改,因为B递增的值是基于A插入的值。即B操作建立在A基础上,所以B后发生。B是因果依赖于A

如下图中的两个写入是并发:每个客户端启动写操作时,并不知道另一个客户端是否也在执行操作同样的K。因此,操作之间不存在因果关系

若B知道A或依赖A或以某种方式基于A构建,则称操作A在操作B之前发生。在另一个操作之前,是否发生一个操作,是定义并发的关键。也可简单说,若两个操作都不在另一个之前发生,则两个操作是并发的(即,两个操作都不知道另一个)【54】。
因此,两个操作AB,有三种可能性:A在B前发生或B在A前发生或AB并发。我们一个算法告诉我们两个操作是否并发:
- 若一个操作先于发生另一个操作,则后面的操作可覆盖较早的操作
- 若这些操作并发,则存在需要解决潜在冲突问题
边栏推荐
- 牛客 HJ19 简单错误记录
- 第二届中国PWA开发者日
- 智能垃圾桶(九)——震动传感器(树莓派pico实现)
- tensorflow2.0 cnn(layerwise)
- Small program: Matlab solves differential equations "recommended collection"
- update data table update
- C语言-函数
- form 表单提交后,使页面不跳转[通俗易懂]
- The new BMW 3 Series is on the market, with safety and comfort
- How does automated testing create business value?
猜你喜欢

Implementing DDD based on ABP

【Meetup预告】OpenMLDB+OneFlow:链接特征工程到模型训练,加速机器学习模型开发

上传图片-微信小程序(那些年的坑记录2022.4)

动态规划(一)
How Redis handles concurrent access

Kubernetes principle analysis and practical application manual, too complete

动态规划之线性dp(上)

最新神作!阿里巴巴刚出炉的面试参考指南(泰山版),我直接狂刷29天
![[TypeScript] In-depth study of TypeScript type operations](/img/d9/ee240ccba72e8d3114ee5c52ed0c8f.png)
[TypeScript] In-depth study of TypeScript type operations

长得很怪的箱图
随机推荐
【7.29】Code Source - 【Arrangement】【Stone Game II】【Cow and Snacks】【Minimum Number of Spawns】【Sequence】
【网络通信三】研华网关Modbus服务设置
【pytorch】pytorch 自动求导、 Tensor 与 Autograd
多主复制下处理写冲突(4)-多主复制拓扑
动态规划之线性dp(下)
牛客 HJ20 密码验证合格程序
Summary of the implementation method of string inversion "recommended collection"
ansible study notes 02
gerrit中如何切换远程服务器
小程序:matlab解微分方程「建议收藏」
研发过程中的文档管理与工具
第05章 存储引擎【1.MySQL架构篇】【MySQL高级】
智能垃圾桶(九)——震动传感器(树莓派pico实现)
你辛辛苦苦写的文章可能不是你的原创
Mariabackup实现Mariadb 10.3的增量数据备份
动态规划(一)
MySQL数据库操作
牛客网刷题(四)
Kubernetes common commands
LevelSequence源码分析

