如果这篇博客帮助到你,可以请我喝一杯咖啡~
CC BY 4.0 (除特别声明或转载文章外)
通常认为弱一致性模型给程序开发人员增加了额外的负担。这一命题在那种程度上确实是正确的
分两个角度考虑。
- 强一致性模型通常使用如锁或通信的同步机制来保证对同步变量的操作一致连续,而弱一致性模型下复制是异步的,这会导致编程时需要考虑副本间的差异、各种操作之间的依赖关系以及伴随的各种情况。从这一点上来看弱一致性模型给程序开发人员增加了额外的负担。
- 弱一致模型通常比强一致模型有更强的容错性、扩展性、吞吐量,也可以降低服务的延迟,在这个角度上看弱一致模型在开发上也有其便利性。
你会选择哪种类型的一致性来实现电子股票市场?请解释你的答案
因果一致性。因为考虑到股价的前后变化是有逻辑上的顺序的,对同一支股票的买入卖出之间可能会有因果联系;而不同股票的操作就通常没有关系,放松限制条件可以提高服务性能。
请列举全序广播的实现方法,解释基本原理并比较它们之间的不同点。从全序广播的实现方法中选取2个或2个以上进行比较,这篇论文的Introduction中介绍了一些方法
- 优先级算法通过令牌环实现消息排序,使用捎带机制优化之后能够在高负载情况下运行,但由于算法的延迟时间随着成员数目的增加而线性增长,不具有可扩展性。
- 在排序器算法中,特殊的排序器进程为每一条应用程序消息发送额外的排序消息来指明其顺序,该类算法在低负载时能够获得较低的延迟时间,但是控制消息的比例大,不能够在高负载情况下工作。
- 逻辑时钟算法使用通信的历史信息建立消息的全序关系,为了保证算法活性,组成员需要发送空消息以保持较高的消息发送频率,容易导致网络阻塞。
- 基于概率分析提出了一种确定性合并算法,它是在预知负载分布情况下的理论上最佳算法,然而该算法要求非常苛刻的系统模型:系统中必须存在同步的物理时钟,并且进程发送消息的时间间隔严格地服从指数分布。
虽然目前的全序组播算法在排序机制方面存在差异,但是都不能同时实现低延迟和高吞吐量:排序其算法和逻辑时钟算法难以提供高吞吐量,而优先级算法不能实现低延迟(延迟随成员数目线性增长)
请列举顺序一致性、因果一致性、单调读、单调写、读写一致性、写读一致性的具体场景
顺序一致性
- 任何一次读都能读到某个数据的最近一次写的数据。
- 系统的所有进程的顺序一致,而且是合理的。即不需要和全局时钟下的顺序一致,错的话一起错,对的话一起对。
例如,银行的交易记录就应该是顺序一致性的,实时扣除的账户金额,到另一个账户上是有时延的,但是最终要求金额准确无误。需要为用户保证绝对可靠的数据安全,虽然在数据一致性上存在延时,但最终务必保证严格的一致。
因果一致性
- 如果进程A通知进程B它已更新了一个数据项,那么进程B的后续访问将返回更新后的值,且一次写入将保证取代前一次写入。与进程A无因果关系的进程C的访问,遵守一般的最终一致性规则。
电子股票交易市场可以使用因果一致性,理由见第二问。
单调读
- 单调读意味着如果一个用户进行多次读取时,绝对不会遇到时光倒流,即如果先前读取到较新的数据,后续读取不会得到更旧的数据。单调读比强一致性更弱,比最终一致性更强。
单调读可以应用在一个购物网站的库存显示上。商品详情页面上显示的库存量,通常不是商品的真实库存量,只有在下单购买的时候,系统才会检查该商品的真实库存量。使用单调读,可以使用户不会发现库存越来越多的诡异情况。
单调写
- 单调写意味着一个系统要能够保证来自同一个节点的写操作被顺序的执行。
例如,用户在论坛连续回贴时,回帖需要按他回复的顺序排列,不能在刷新后乱序甚至丢失。
读写一致性
一个论坛服务器可以使用读写一致性,它可以保证,如果用户刷新页面,他们总会看到自己刚提交的任何帖子和更新。它不会对其他用户的写入做出承诺,其他用户的更新可能稍等才会看到,但它保证用户自己提交的数据能马上被自己看到。
写读一致性
一个贴子的引用机制可以使用写读一致性。由于用户在引用的过程中被引用的内容自身可能被修改和删除,引用的部分通常会使用用户最新读到的一次缓存。