【译】在分布式系统中解决,或平衡微服务的复杂度 - part 2

原文标题: Untangling Microservices, or Balancing Complexity in Distributed Systems

原文地址[1] 上篇地址[2] 翻译:祝坤荣

微服务

让我们先从精确定义什么是服务和微服务来开始。

什么是服务?

根据OASIS标准 9[3] ,一个服务是:

通过规定好的接口提供能访问一种或多种能力的机制

规定好的接口这部分很重要。服务的接口定义了它暴露给外界的功能。根据Randy Shoup 10[4]的说法,服务的公共接口简单来说就是任何让数据进出服务的机制。它可以是同步化的,如简单的请求/响应模型,或者异步化的,一个生产事件一个消费事件。不管怎么说,同步或异步化,公共接口只代表让数据进出一个服务。Randy也表达了服务的公共接口就跟前门是一样的。

服务是被公共接口定义的,这个定义对于定义什么服务是微服务也足够了。

什么是微服务?

如果一个服务是被它的公共接口定义的,那么 -

一个微服务是指一个用了微型公共接口的服务 - 微型前门

这条在过程式编程中被遵守的规则,如今在分布式系统领域更加有关联性。你暴露的服务越小,它的实现越简单,它的本地复杂性越小。从全局复杂度来看,更小的公共接口会在服务间产生更少的依赖和连接。

微接口的概念也解释了广泛使用的微服务不暴露数据库的实践。没有微服务可以访问另一个微服务的数据库,只能通过其提供的公共接口。为什么?因为,数据库实际是一个巨大的公共接口!只要想想你可以在一个关系数据库上能执行多少种操作。

因此,再重申下,在分布式系统中,我们通过将服务的公共接口最小化的方式来平衡局部与全局复杂度,然后服务就变成了微服务。

警告

这听起来很简单但其实不然。如果一个微服务只是有微型公共接口的服务,那我们可以直接将公共接口限制到只有一个方法。由于这个“前门”已经小的不能再小了,这应该是完美的微服务,对吗?为了解释为什么不这么做,我会使用我另一篇博文11[5]里的一个例子:

加入我们有如下库存管理服务:

如果我们将它拆成八个服务,每个只有一个简单的公共方法,我们可以得到完美的低本地复杂度的服务:

但我们能将它们连入系统来真正管理库存吗?并不行。要形成系统,服务需要与其他服务交互并共享对于每个服务的状态。但它们不行。服务的公共接口不支持。

因此,我们要继承这个“前门”并让这些公共方法可以支持服务间的集成:

完了!如果我们通过将每个服务完全独立的方式来优化复杂度,那么解耦的是很彻底。但是,当我们将服务连入系统,全局复杂度又升高了。不只是导致系统卷入了一团乱麻;为了集成 - 继承公共接口也超出了我们原来的意图。引自Randy Shoup,除了建设了一个小“前门”,我们也建了一个巨大的“员工专用”入口!这告诉我们一个重要的观点:

一个服务有比业务方法更多的集成方法有成长为分布式大泥球的巨大可能!

因此,一个服务的公共接口可以被最小化到什么程度不只是依赖于服务本身,也取决(主要)于它在系统中是哪一部分。一个微服务何时的解耦应该同时考虑系统的全局复杂度和服务的局部复杂度。

设计服务边界

“要找到服务边界太难了... 完全没有流程图!” -Udi Dahan

上面Udi Dahan说的话对于基于微服务的系统来说也很对。设计微服务的边界很难,基本上第一次很难做对。折让设计一个合适复杂度的微服务变成了一个迭代流程。

因此,从更大的边界开始是比较安全的 - 从上下文边界开始比较合适12[6] - 有更多关于系统各它的业务域的知识后,再将它们解耦成微服务。这对那些包含了核心业务域的服务特别重要13[7]

分布式系统之外的微服务

尽管微服务只是最近才被“发明”出来,你仍可以在工业界发现很多有同样设计理念的实现。这些包括:

跨功能团队

我们知道跨功能团队是最有效的。这种团队让不同专业能力的小组工作在同一个任务上。一个有效的跨功能团队能最大化团队内的交流,最小化团队外的交流。

我们的工业只是最近才发现跨功能团队,但任务组是一直存在的。其底层的原理与基于微服务的系统是一样的:在团队内高聚合,团队间低耦合。团队的“公共接口”通过需要达成任务的技能来进行最小化(如实现的细节)。

微处理

我要通过Vaughn Vernon那经典的相关主题的博文[8]来举这个例子。在他的博客里,Vaughn描绘了一个微服务与微处理器间有趣的相似点。他讲述了处理器与微处理器间的不同:

我发现了一个通过大小规格来帮助确定一个处理器是中央处理器(CPU)还是微处理器:数据总线21[9]的大小

微处理器的数据总线就是他的公共接口 - 它定义了可以被传给微处理器与其他组件间的数据量。对于公共接口有严格的尺寸规格来定义这个中央处理器(CPU)是不是一个微处理器。

Unix哲学

Unix哲学,或Unix方式,是一种秉承了极简主义的模块化软件开发规范和文化。22[10]

有人可能会反驳我Unix哲学与我的情况不符,你不能用完全独立的组件来组装一个系统。难道unix程序不是完全独立,然后形成一个可工作的系统的吗?事实正相反。Unix方式几乎字面上定义了程序需要暴露的微交互操作。让我们看看Unix哲学与微服务相关的部分:

第一条原理让程序暴露一个与其功能相关的公共接口,而不是与其原始目标不想关的:

让程序只做一件事并做好。要做另一件事,写个新的而不是在老程序里加新“特性”

尽管Unix命令被认为是彼此间完全独立的,但并不是。它们之间需要通信,并且第二条原则定义了通信的接口如何设计:

预期所有程序的输出会作为其他程序的输入,尽管可能现在还不知道。不要让输出有不相关的信息。避免严格的列式或二进制输入格式。不要强制要求交互式命令有输入。

不只是通信接口被严格限制(标准输入,标准输出,标准错误),基于这个原则,在命令间的数据传输也被严格限制住了。例如,Unix命令需要暴露微-接口并永远不依赖于其他命令的实现细节。

那么Nano服务呢?

文字nanoservice经常是用来描述一个服务太小了。有人会说上面例子介绍的一个方法的服务就是nano服务。我不同意这个观点。

nano服务用用来在忽略了整体系统时描述单独服务时用的。在上面例子中,一旦我们将系统放入方程中,服务的接口就会增长。实际上,当我们比较一下原来的单服务实现与解耦后的实现,我们可以看到一旦将服务连入系统,系统从8个公开接口增长到38个。而且,每个服务公开方法的平均数量从1涨到4.75.

因此,当我们又花了服务(公共接口),数据nano服务不再成立,因为服务被迫开始增长来支持系统的用例。

这些够了吗?

不。尽管最小化服务的公共接口是一个设计微服务的好原则,它仍然只是一种探索式的方式而不能取代常识。实际上,微接口只是更加基础,且更复杂的耦合与内聚设计原则的抽象。

比如,如果两个服务有微-公开接口,它们让需要在分布式事务中协调,它们仍是互相高耦合的。

针对微-接口在解决不同类型的耦合,比如函数,开发,语义仍然是有启发的。但那就是另一篇博客的主题了。

从理论到实践

不幸的是,我们没有一个客观方式来量化局部与全局复杂度。从另一方面,我们确实有一些设计方式可以优化分布式系统的设计。

这篇文章主要的内容就是想告诉你在评估服务的公共接口是你要不停的问自己:

•业务的占比是多少 - 给定服务是面向集成的endpoint吗?•这是在业务上不想关的endpoint吗?在不引入面向集成的endpoint的前提下你可以将它们分离成2个或更多服务吗?•合并两个服务是否能消除当初为了集成原始服务而产生的endpoint?

可以用这些原则来指导你在服务边界和接口的设计。

概要

我想最后用Eliyahu Goldratt的观点来总结下。在他的书里,他经常重复下面这些句子:

"告诉我你如何度量我,我会告诉你我怎样表现" - Eliyahu Goldratt

当设计基于微服务的系统时,很重要的就是度量和优化正确的指标。为微服务代码库设计边界,则微小组的定义会更容易。所以,开发一个系统,我们要学会算账。微服务是用来设计系统的,而不是独立的服务。

回到这片的标题-“在分布式系统中解决,或平衡微服务的复杂度”。解开微服务问题的唯一办法就是平衡每个服务的局部复杂度与整个系统的全局复杂度

引用索引

1.Gergely Orosz’s tweet on Uber2.Monoliths are the future3.Microservices guru warns devs that trendy architecture shouldn’t be the default for every app, but ‘a last resort’4.Monolithic Application(Wikipedia)5.The Majestic Monolith - DHH6.Big Ball of Mud(Wikipedia)7.Definition of a System 8 .Composite/Structures Design - book by Glenford J. Myers 9 .Reference Model for Service Oriented Architecture 10 .Managing Data in Microservices - talk by Randy Shoup 11 .Tackling Complexity in Microservices 12 .Bounded Contexts are NOT Microservices 13 .Revisiting the Basics of Domain-Driven Design 14 .Implementing Domain-Driven Design - book by Vaughn Vernon 15 .Modular Monolith: A Primer - Kamil Grzybek 16 .A Design Methodology for Reliable Software Systems - Barbara Liskov8.Designing Autonomous Teams and Services9.Emergent Boundaries - a talk by Mathias Verraes10.Long Sad Story of Microservices - talk by Greg Young11.Principles of Design - Tim Berners-Lee12.Microservices and [Micro]services - Vaughn Vernon13.Unix Philosophy


本文来自祝坤荣(时序)的微信公众号「麦芽面包,id「darkjune_think」 开发者/科幻爱好者/硬核主机玩家/业余翻译

微博:祝坤荣

B站: https://space.bilibili.com/23185593/ 求关注转发一键三连!

交流Email: zhukunrong@yeah.net[11]

转载请注明。

References

[1] 原文地址: https://vladikk.com/2020/04/09/untangling-microservices/
[2] 上篇地址: https://segmentfault.com/a/1190000040009315
[3] 9: https://docs.oasis-open.org/soa-rm/v1.0/soa-rm.html
[4] 10: https://www.youtube.com/watch?v=E8-e-3fRHBw
[5] 11: https://vladikk.com/2018/02/28/microservices/
[6] 12: https://vladikk.com/2018/01/21/bounded-contexts-vs-microservices/
[7] 13: https://vladikk.com/2018/01/26/revisiting-the-basics-of-ddd/
[8] 相关主题的博文: https://kalele.io/microservices-and-microservices/
[9] 21: https://kalele.io/microservices-and-microservices/
[10] 22: https://en.wikipedia.org/wiki/Unix_philosophy
[11] zhukunrong@yeah.net: mailto:zhukunrong@yeah.net

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
!!注意:全文有99M,由于上传文件不得超过60M,所以分成两个压缩文件,这是part1.part2在以下网页: http://download.csdn.net/detail/hellowjl1/4682120 在本书,作者给出设计,实现和分析分布式算法的蓝图。本书适合学生、程序员、系统分析员和研究人员等不同类型的读者。本书包括这个领域最重要的算法和不可能解.而且都采用简单的自动机理论进行论述。对所有算法的正确性都给予证明.并且根据精确定义的复杂度标准分析算法的复杂度。其涉及的问题包括资源分配、通信、分布式处理器之间的一致性、数据一致性、死锁检测、领导者进程的选取、全局快照等。    本书的内容按照系统模型组织,首先是根据定时模型.然后在定时模型内再根据进程间的通信机制。不同系统的材料分别独立成章,便于查阅。    本书论述十分严谨,但又很直观.便于读者迅速理解。本书也为读者提供设计新的算法和证明新的不可能解的基本数学工具。而且,它教给读者怎样对分布式系统进行严格的推理 ―包括形式化建模,为它们所需的行为设计精确的指标,证明它们的正确性.并且用实际的度量标准来评价它们的性能。    本书对分布式算法进行全面介绍,包括最为重要的算法和不可能性结果。绝大部分的解都给出了数学证明。这些算法都根据精确定义的复杂度衡量方法进行分析。本书还讲述针对许多典型问题的算法、各类系统模型及其能力。章后提供大量习题并列出了详细的参考文献。    本书可作为高等院校计算机系研究生的教材,尤其适合对计算机理论或体系结构感兴趣的学生学习,还适合分布式设计人员、研究人员及其相关技术人员参考。 出版者的话 专家指导委员会 者序 前言 第1章 引言 1 1.1 相关主题 1 1.2 我们的观点 2 1.3 本书内容综述 3 1.4 参考文献注释 7 1.5 标记 7 第一部分 同步网络算法 第2章 建模i:同步网络模型 10 2.1 同步网络系统 10 2.2 故障 11 2.3 输入和输出 11 2.4 运行 11 2.5 证明方法 12 2.6 复杂度度量 12 2.7 随机化 12 2.8 参考文献注释 13 .第3章 同步环的领导者选择 14 3.1 问题 14 3.2 相同进程的不可能性结果 14 3.3 基本算法 15 3.4 通信复杂度为o(n log n)的算法 17 3.5 非基于比较的算法 19 3.5.1 时间片算法 20 3.5.2 变速算法 20 3.6 基于比较的算法的下界 21 3.7 非基于比较的算法的下界* 25 3.8 参考文献注释 26 3.9 习题 27 第4章 一般同步网络的算法 29 4.1 一般网络的领导者选举 29 4.1.1 问题 29 4.1.2 简单的洪泛算法 29 4.1.3 降低通信复杂度 31 4.2 广度优先搜索 32 4.2.1 问题 32 4.2.2 基本的广度优先搜索算法 33 4.2.3 应用 34 4.3 最短路径 35 4.4 最小生成树 36 4.4.1 问题 36 4.4.2 基本定理 36 4.4.3 算法 37 4.5 最大独立集 39 4.5.1 问题 40 4.5.2 随机化算法 40 4.5.3 分析* 42 4.6 参考文献注释 43 4.7 习题 43 第5章 链路故障时的分布式一致性 46 5.1 协同攻击问题―确定性版本 46 5.2 协同攻击问题―随机化版本 48 5.2.1 形式化模型 49 5.2.2 算法 49 5.2.3 不一致的下限 52 5.3 参考文献注释 54 5.4 习题 54 第6章 进程故障下的分布式一致性 56 6.1 问题 56 6.2 针对停止故障的算法 58 6.2.1 基本算法 58 6.2.2 减少通信 59 6.2.3 指数信息收集算法 61 6.2.4 带鉴别的byzantine一致性 66 6.3 针对byzantine故障的算法 66 6.3.1 举例 66 6.3.2 byzantine一致性问题的eig算法 68 6.3.3 使用二元byzantine一致的一般 的byzantine一致性问题 71 6.3.4 减少通信开销 72 6.4 byzantine一致性问题进程的个数 74 6.5 一般图的byzantine一致性问题 78 6.6 弱byzantine一致性 81 6.7 有停止故障时的轮数 82 6.8 参考文献注释 88 6.9 习题 89 第7章 更多的一致性问题 93 7.1 k一致性问题 93 7.1.1 问题 93 7.1.2 算法 93 7.1.3 下界* 95 7.2 近似一致性 102 7.3 提交问题 105 7.3.1 问题 105 7.3.2 两阶段提交 106 7.3.3 三阶段提交 107 7.3.4 消息数的下界 109 7.4 参考文献注释 111 7.5 习题 111 第二部分 异步算法 第8章 建模ii:异步系统模型 114 8.1 输入/输出自动机 114 8.2 自动机的操作 118 8.2.1 合成 118 8.2.2 隐藏 121 8.3 公平性 121 8.4 问题的输入和输出 123 8.5 属性与证明方法 124 8.5.1 不变式断言 124 8.5.2 轨迹属性 124 8.5.3 安全与活性属性 125 8.5.4 合成推理 126 8.5.5 层次化证明 128 8.6 复杂度衡量 130 8.7 不可区分运行 131 8.8 随机化 131 8.9 参考文献注释 131 8.10 习题 132 第二部分a 异步共享存储器算法 第9章 建模iii:异步共享存储器模型 136 9.1 共享存储器系统 136 9.2 环境模型 138 9.3 不可区分状态 140 9.4 共享变量类型 140 9.5 复杂度衡量 144 9.6 故障 144 9.7 随机化 145 9.8 参考文献注释 145 9.9 习题 145 第10章 互斥 146 10.1 异步共享存储器模型 146 10.2 问题 148 10.3 dijkstra的互斥算法 151 10.3.1 算法 151 10.3.2 正确性证明 154 10.3.3 互斥条件的一个断言证明 156 10.3.4 运行时间 157 10.4 互斥算法的更强条件 158 10.5 锁定权互斥算法 159 10.5.1 双进程算法 159 10.5.2 n进程算法 163 10.5.3 锦标赛算法 167 10.6 使用单写者共享存储器的算法 170 10.7 bakery算法 171 10.8 寄存器数量的下界 173 10.8.1 基本事实 174 10.8.2 单写者共享变量 175 10.8.3 多写者共享变量 175 10.9 使用读-改-写共享变量的互斥 179 10.9.1 基本问题 179 10.9.2 有界绕过次数 180 10.9.3 锁定权 185 10.9.4 模拟证明 187 10.10 参考文献注释 189 10.11 习题 190 第11章 资源分配 194 11.1 问题 194 11.1.1 显式资源说明和互斥说明 194 11.1.2 资源分配问题 195 11.1.3 哲学家用餐问题 196 11.1.4 解法的受限形式 197 11.2 对称哲学家用餐算法的不存在性 197 11.3 右-左哲学家用餐算法 199 11.3.1 等待链 199 11.3.2 基本算法 200 11.3.3 扩展 202 11.4 哲学家用餐随机算法* 204 11.4.1 算法* 205 11.4.2 正确性* 207 11.5 参考文献注释 212 11.6 习题 213 第12章 一致性 215 12.1 问题 215 12.2 使用读/写共享存储器的一致性 217 12.2.1 限制 218 12.2.2 术语 218 12.2.3 双价初始化 218 12.2.4 无等待终止的不可能性 219 12.2.5 单故障终止的不可能性结果 221 12.3 读/改/写共享存储器上的一致性 问题 223 12.4 其他共享存储器类型 224 12.5 异步共享存储器系统的可计算性* 224 12.6 参考文献注释 225 12.7 习题 226 第13章 原子对象 229 13.1 定义和基本结论 229 13.1.1 原子对象的定义 229 13.1.2 规范无等待原子对象自动机 235 13.1.3 原子对象的合成 237 13.1.4 原子对象和共享变量 237 13.1.5 显示原子性的一个充分条件 241 13.2 用读/写变量实现读-改-写原子对象 242 13.3 共享存储器的原子快照 243 13.3.1 问题 243 13.3.2 带无界变量的一个算法 244 13.3.3 带有界变量的一个算法* 247 13.4 读/写原子对象 250 13.4.1 问题 250 13.4.2 证明原子性的其他引理 250 13.4.3 带无界变量的一个算法 251 13.4.4 两个写者的有界算法 254 13.4.5 使用快照的算法 258 13.5 参考文献注释 259 13.6 习题 260 第二部分b 异步网络算法 第14章 建模iv:异步网络模型 264 14.1 发送/接收系统 264 14.1.1 进程 264 14.1.2 发送/接收通道 264 14.1.3 异步发送/接收系统 268 14.1.4 使用可靠fifo通道的发送/ 接收系统的特征 268 14.1.5 复杂度度量 269 14.2 广播系统 269 14.2.1 进程 269 14.2.2 广播通道 270 14.2.3 异步广播系统 270 14.2.4 采用可靠广播通道的广播系统 的特征 270 14.2.5 复杂度度量 271 14.3 多播系统 271 14.3.1 进程 271 14.3.2 多播通道 271 14.3.3 异步多播系统 272 14.4 参考文献注释 272 14.5 习题 272 第15章 基本异步网络算法 274 15.1 环的领导者选举 274 15.1.1 lcr算法 275 15.1.2 hs算法 278 15.1.3 peterson leader算法 278 15.1.4 通信复杂度的下界 281 15.2 任意网络的领导者选举 286 15.3 生成树的构造、广播和敛播 287 15.4 广度优先搜索和最短路径 290 15.5 最小生成树 295 15.5.1 问题描述 295 15.5.2 同步算法:回顾 296 15.5.3 ghs算法:概要 296 15.5.4 更详细的算法 297 15.5.5 特殊消息 299 15.5.6 复杂度分析 301 15.5.7 ghs算法的正确性证明 301 15.5.8 简单“同步”策略 302 15.5.9 应用到领导者选举算法 302 15.6 参考文献注释 303 15.7 习题 303 第16章 同步器 307 16.1 问题 307 16.2 局部同步器 309 16.3 安全同步器 313 16.3.1 前端自动机 314 16.3.2 通道自动机 315 16.3.3 安全同步器 315 16.3.4 正确性 315 16.4 安全同步器的实现 316 16.4.1 同步器alpha 316 16.4.2 同步器beta 317 16.4.3 同步器gamma 317 16.5 应用 320 16.5.1 领导者选举 321 16.5.2 深度优先搜索 321 16.5.3 最短路径 321 16.5.4 广播与确认 321 16.5.5 最大独立集 321 16.6 时间下界 321 16.7 参考文献注释 324 16.8 习题 324 第17章 共享存储器与网络 326 17.1 从共享存储器模型到网络模型 的转换 326 17.1.1 问题 326 17.1.2 无故障时的策略 327 17.1.3 容忍进程故障的算法 332 17.1.4 对于n/2故障的不可能性结果 335 17.2 从网络模型转换到共享存储器模型 336 17.2.1 发送/接收系统 336 17.2.2 广播系统 338 17.2.3 异步网络一致性的不可能性 338 17.3 参考文献注释 339 17.4 习题 339 第18章 逻辑时间 341 18.1 异步网络的逻辑时间 341 18.1.1 发送/接收系统 341 18.1.2 广播系统 343 18.2 使用逻辑时间的异步算法 344 18.2.1 时钟的走动 344 18.2.2 延迟未来事件 345 18.3 应用 346 18.3.1 银行系统 346 18.3.2 全局快照 348 18.3.3 模拟一台单状态机器 349 18.4 从实际时间算法到逻辑时间算法 的变换* 352 18.5 参考文献注释 352 18.6 习题 353 第19章 一致全局快照和稳定属性检测 355 19.1 发散算法的终止检测 355 19.1.1 问题 355 19.1.2 dijkstrascholten算法 356 19.2 一致全局快照 360 19.2.1 问题 360 19.2.2 chandylamport算法 361 19.2.3 应用 364 19.3 参考文献注释 366 19.4 习题 367 第20章 网络资源分配 369 20.1 互斥 369 20.1.1 问题 369 20.1.2 模拟共享存储器 370 20.1.3 循环令牌算法 370 20.1.4 基于逻辑时间的算法 372 20.1.5 logicaltimeme算法的改进 374 20.2 通用资源分配 376 20.2.1 问题 376 20.2.2 着色算法 377 20.2.3 基于逻辑时间的算法 377 20.2.4 无环有向图算法 378 20.2.5 哲学家饮水* 379 20.3 参考文献注释 383 20.4 习题 383 第21章 带进程故障的异步网络计算 386 21.1 网络模型 386 21.2 有故障环境一致性的不可能性 387 21.3 随机算法 388 21.4 故障检测器 390 21.5 k一致性 393 21.6 近似一致性 394 21.7 异步网络的计算能力* 395 21.8 参考文献注释 396 21.9 习题 396 第22章 数据链路协议 399 22.1 问题阐述 399 22.2 stenning协议 400 22.3 位变换协议 403 22.4 可重排序的有界标志协议 406 22.4.1 关于重排序和复制的不可能 性结论 407 22.4.2 容许丢失和重排序的有界标 志协议 408 22.4.3 不存在容许消息丢失和重排序 的高效协议 412 22.5 容许进程崩溃 414 22.5.1 简单的不可能性结论 415 22.5.2 更复杂的不可能性结论 415 22.5.3 实用的协议 418 22.6 参考文献注释 423 22.7 习题 423 第三部分 部分同步算法 第23章 建模v: 部分同步系统模型 428 23.1 mmt 定时自动机 428 23.1.1 基本定义 428 23.1.2 操作 432 23.2 通用定时自动机 434 23.2.1 基本定义 434 23.2.2 将mmt自动机转化为通用定时 自动机 437 23.2.3 操作 440 23.3 属性和证明方法 441 23.3.1 不变式 441 23.3.2 定时轨迹属性 443 23.3.3 模拟 444 23.4 构造共享存储器和网络系统的模型 449 23.4.1 共享存储器系统 449 23.4.2 网络 449 23.5 参考文献注释 449 23.6 习题 450 第24章 部分同步的互斥 452 24.1 问题 452 24.2 单寄存器算法 453 24.3 对时间故障的回复性 459 24.4 不可能性结果 461 24.4.1 时间下界 462 24.4.2 最终时间界限的不可能性结果* 462 24.5 参考文献注释 463 24.6 习题 463 第25章 部分同步的一致性 466 25.1 问题 466 25.2 故障检测器 467 25.3 基本结论 468 25.3.1 上界 468 25.3.2 下界 469 25.4 有效算法 470 25.4.1 算法 471 25.4.2 安全属性 472 25.4.3 活性和复杂度 473 25.5 涉及时间不确定性的下界* 475 25.6 其他结果* 480 25.6.1 同步进程、异步通道* 480 25.6.2 异步进程、同步通道* 481 25.6.3 最终时间界限* 481 25.7 小结 483 25.8 参考文献注释 483 25.9 习题 483 参考文献 486 索引 512

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值