应用工程师的分布式系统理论

  • Andrew Morgan
  • 金灵杰

2017 年 6 月 25 日

话题:语言 & 开发架构

分布式系统工程师、《RabbitMQ 实战》合著者 Alvaro Videla 在 2017 伦敦 QCon 上回顾了分布式系统理论。主题涵盖将分布式系统从不同维度进行分类,例如时间模型、故障模式。并讨论这些类别的选型考虑因素。

Videla 首先介绍了几种时间模型,它们的区别主要在于分布式系统每步处理时间是否已知。他列举了三类(注意不要和并行编程中的相关概念混淆):

  • 同步:该类分布式系统已知其每一步的耗时。虽然这能够在诸如故障检测上有所帮助,但是真实系统不可能做到。
  • 异步:该类分布式系统每一步执行都无序,且无法保证执行耗时。这更符合真实的系统,但是真实系统一般都会引入超时机制。
  • 半同步:该类分布式系统每一步执行至少能够提供一些耗时信息,因此可以为其设置阈值。

Videla 还阐述了进程间通信的方式。一般系统要么选择消息传递机制,要么选择共享内存方式。

Videla 最后提到的分类方式是故障模式,它是按照进程故障类型进行分类的,包括:

  • 崩溃后停止:当一个进程崩溃后,再也无法恢复。这不能反应真实场景,一般当一台机器故障时,它不会被处置,而是被重新利用。
  • 崩溃后恢复:当一个进程崩溃后,可以通过一系列恢复算法进行恢复。例如通过从数据库重新读取,或是和其他进程进行交互。
  • 忽略故障:当进程无法接收或者发送消息的时候,直接忽略它。对此 Videla 给的例子是缓存模块,当发生可以接收消息,但是无法发送响应消息的场景。此时对于客户端来说,缓存模块仍然是有效的,因为它仍然保存着最新的数据。
  • 任意失效模式:此模式下,一旦进程开始发送或者接收不正确的消息,这些消息的计算结果应该能够反映系统处于失效的状态。

Videla 强调,在这些模式和类型中间选择时没有银弹。最终的选型一定是基于系统需求权衡的结果。

还有一点值得注意的是,上述一些选项无法反映真实系统,但是它们在分布式系统理论中还是有用的。这是因为它们相对简单,可以用于验证基于这些简单场景的新算法。这些算法如果在简单模型下适用,它们也可能适用于更加复杂的场景。

除此之外,Videla 还介绍了故障检测,这是一种用于检测其他进程是否正常的算法。设计这些算法的主要难点在于区分故障进程和长耗时进程。对此 Videla 介绍了名为“最终完美故障检测器(Eventually Perfect Failure Detector)”,它基于超时进行扩展,将超过一定时限的进程标记为嫌疑进程。这意味着,如果被标记为有故障嫌疑的进程,后面被发现仍然存活,将会从嫌疑列表中移除。

完整视频可以在线观看,同时 Videla 也以此主题写了一篇文章。文章介绍了仲裁(quorum)和一致性等额外的概念,同时也给出了后续阅读的建议。

查看英文原文

Distributed Systems Theory for Practical Engineers
语言 & 开发架构