todos:
还在出去玩,之後补上演算法 pesudocode + comments
8.2 提到的 Google spanner 也是
two-phase locking、serializability 等等原来是在前半部 concurrent 的范围,但之後考虑在文章内做补充
现代有很多协作工具,例如 hackmd、Google docs,
或是不同装置之间日历的同步,
使用这些 app 时都可能会有短暂断线,而後才连上,
如果这时候发生了不同 replica(装置)上的存档有冲突,该怎麽解决呢?
其实这种多人协作的应用程序,也可以采用第 7 章提到的 linearizable read/writes 方法,但除了很慢(读写都要与 quorum 个节点交流往返)还不能断线。
为了让使用者体验,大部分协作软件会采用 strong eventual consistency,等到装置连线上了,再想办法解决冲突。
CRDT 主要有两种:
broadcast (set, t1, “title”, “Lecture 1”)
{演算法place holder}
{演算法place holder}
Operation-based: 通常广播讯息比较小。
State-based: 可以接受讯息遗失、
![[Screen Shot 2021-09-25 at 8.08.46 PM.png]]
userA:在 0 插入 A,而後收到 userB 在 2 插入 D 的讯息,但因为对方插入位子的计算是基於还没 insert(0,A) 的状态,所以直接在现在的 2 插入 D 就会出错。
![[Screen Shot 2021-09-25 at 7.39.00 PM.png]]
把刚收到的其他节点的更新,
以目前节点最新的状态做一些 transformation 计算(需要透过 timestamp),
而得到能够用在现在状态的更新。
篇幅关系,这堂课并没有对 OT 的计算深入介绍。
这里介绍了另一种解决上述协作问题的方法。
如果以 index 来作为插入的标的,那只要本地的状态被更新,从其他节点送来的更新势必要透过 OT 转换过才能 apply。
而如果改成头尾0到1之间,插入时,是把要插入的两边的节点的位置取中间值,不同节点之间的更新都是依据相对的位子,就不用担心之前插入时 index 已经跑掉的问题。
但要小心小数点的精度。
![[Screen Shot 2021-09-25 at 7.59.45 PM.png]]
{演算法place holder}
>>: 【Day10-去重】使用python优雅的一行解决list或DataFrame资料去重问题
昨天介绍完DBSCAN演算法,今天就要来写DBSCAN程序: 首先利用昨天创建好资料 首先先设置r ...
上一篇[我们的基因体时代-AI, Data和生物资讯 Day25- 再深一点:AnnotationH...
-示例 XACML 实现 基於风险和基於属性的存取控制是授权机制,而不是存取控制策略语言。SAML...
什麽是单元测试? 单元测试 (Unit Testing) 是针对程序码的最小单位来进行正确性检验的测...
今天要要介绍最後一个 Behavioral Patterns,也就是Template Metho...