【Day 11】分散式系统小总结

今天沙滩车太累ㄌ好想弃赛

透过这八堂课,也算是对分散式系统有一些初步认识,
之後再找时间接着看 Martin Kleppmann 的 Designing Data-Intensive Applications。
老实说毕竟还没开始工作,并不清楚这些知识会怎麽样帮助到未来,
但上课中了解到各种问题、并思考如何解决,还是非常过瘾的事情~

第一章初步认识了什麽是分散的系统,分散式系统中节点们经常使用 RPC 来联系,
以及把大程序切成透过 RPC 互相交流的 micro services。

第二章提到两个思想实验:two generals 以及 byzantine generals 问题,分别代表网路与节点出状况。接着为了方便未来讨论,对 network / node / timing 建立模型。
并讲解容错(Fault tolerance)、高可用(high availability)的概念,
SPOF 表示一个节点出状况(faulty)时,会导致整个系统烂掉(failure),
而用衡量可用性(availability)需使用 SLO(Service level objective) ,例如此 99.9%的请求都能在 200ms 内得到回覆。

第三章在讲物理时间(Physical time),也就是以经过秒数来计算的时间,
即使用 NTP sync 都还是可能有误差,如果依据物理时间,很可能发生时空旅行(例如讯息错乱)
为了了解逻辑时间,需要先定义 happens before relation,这个关系需要两个节点有讯息往来才能确认先後。Concurrent 的事件则是不能被比较的。
因果关系(Causality)来表示 A 事件可能导致 B,讯息或事件的顺序常常需要符合 causality。如果讯息显示「B:我还没吃」才是「A:你吃晚餐了吗?」,这样违反 causality 的顺序通常也不会是我们期望的结果。

第四章开始讲逻辑时间(Logical time),也就是依据发生的事件数来计算的时间。
有了 Lamport clock,加上节点的 identifier(例如编号或取名),节点们就可以决定出一种符合 causality 的 total order 排序,total order 表示全部的节点都可以被排序而不是只有部分的。
Vector clock 是一组 timestamps,可以捕捉完整的 happens before relation。
反观 lamport clock,就算 Lamport(e1) < Lamport(e2),也只能知道要马 e1 比 e2 早发生,要马两个事件是 concurrent 的。
再来介绍的广播在分散式系统是很重要的一环,确保广播讯息一定会送达(reliable)有很多方法,比较有效率的是节点们收到广播讯息也传给别人,让广播讯息像八卦或是病毒一样传遍整个系统(Gossip protocols)。
广播演算法更重要的差别主要在於讯息「到达应用程序」(deliver)的顺序:分为 FIFO / Casusal / Total order / FIFO total order broadcast。

第五章提到为了容错、可用性、效能等理由,我们希望把一个节点的资料复制(replicate)到别的节点,这些节点称为 replicas。在此介绍了几个使用者互动而更新节点上的资料时,会发生的问题,分别可能要注意演算法是否设计成 idempotent、commutative 等。
而当 replicas 之间的资料不一致,会需要想办法 anti-entropy:每个动作都附上逻辑 timestamps + 删除时做标记(tombstone),这样就能让每个 replica 都保持到最新的纪录。
多个 client 都想对同个数值做更新时,可以 last writer wins,依据 lamport clock 留下最後的更新;也可以使用 multi-value register,依据 vector clock,能够对 concurrent 的事件(称为 siblings 或 conficts)做处理。

开始越来越复杂(?但人在外面先不打了,明天回台北

小总结打到第五章,其他回台北再说


<<:  【没钱买ps,PyQt自己写】Day 11 - 以 Qlabel 在 PyQt 中显示图片 (基於 QImage 使用 OpenCV)

>>:  AE-Lightning 雷电云特效3-Day25

JavaScript Day 2. 关於,运算子们

JavaScript 有许多的运算子,在这里就挑了几个比较常见,却又老是感到模糊的来研究。 赋值运算...

Day15 开发套件 - 实作MethodChannel

Flutter 端: lib/batterylevel.dart:新增取得电池电量资讯方法,透过建立...

让程序码化为 API Doc

先写 API 文件。 可以使用mockAPI的服务取得一组 user 的 API。 因应需求写的 A...

[Day 09] tinyML开胃菜Arduino IDE上桌(下)

书接上回[Day 08] tinyML开胃菜Arduino IDE上桌(上)。 单机版IDE Ard...

[Day 15] Facial Recognition - Eigenfaces

有兴趣知道特徵脸方法 (Eigenfaces)的基本原理 - 主成分分析 (PCA),推荐你看看这...