6.1.2 使用分布式编程模型的原因
我们最终的目标是扩展到多个节点,而通常情况下起点是一个节点上的本地应用:你的笔记本。 那当我们想要进入到前一节中的某个分布拓扑时,究竟什么变化了?我们不可以抽象出所有这些节点都在一个虚拟节点上运行,让某些聪明的工具处理所有的细节,这样我们就完全不懂改变运行在笔记本上的代码?答案是“”不1。 我们不能简单地抽象出本地与分布式环境的差别。 幸运的是,你不必按字面理解。 按照论文《分布式计算笔记》2,有四个重要本地编程与分布式编程不同的地方,不能够忽略。 四个地方分别是延迟,内存访问,部分失败和并发。 下边的列表简单总结了四个地方的不同:
脚注1 仍在想你兜售这个主意的软件供应商肯定不同意
脚注2 1994 Jim Waldo, Geoff Wyant, Ann Wollrath, and Sam Kendall
- 延迟:在合作者之间有网络意味着a,每个消息有延时,和b(TODO:不知所云)。由于拥塞导致的延时,重发的包,断断续续的连接,等等。
- 部分失败:当系统中的某一部分总是出现、消失、重现时,知道分布式系统中所有部分是够工作是非常难于解决的问题。
- 内存访问:本地系统中获取一个内存中对象的引用不会时不时失败,但是在分布式系统中的确会发生。
- 并发:没有什么拥有一切东西,上述因素意味着交错操作的计划可能会出错。
在分布式系统中使用本地编程模型在扩展时会因为这些差别而导致失败。 Akka 提供的正相反:适用于分布式和本地环境的分布式编程模型。 上面提到的论文也提到了这个选择,称分布式编程以这种方式会简单,但是也说这使得本地编程不必要地复杂,和分布式编程一样复杂。
但是时代变化了。 差不多24年之后,我们需要处理多核 CPU。 而且越来越多的任务需要分布在云上。 对本地系统使用分布式编程模型的优势是,简化了并发编程,如我们在上一章中看到的。 我们已经习惯了异步交互,期望部分失败(甚至拥抱它),我们对并发使用不共享的方法,这同时简化了多核CPU的编程,也为分布式环境做好了准备。 我们会给你展示,这个选择为构建能应对当前挑战的本地和分布式应用提供了坚实的基础。 Akka 为异步编程提供了简单的 API,也提供了在本地和远程测试你的应用的工具。 既然你理解了为本地和分布式系统使用分布式编程模型的原因,我们在下一节中来看看怎样把第二章中构建的 goticks.com 应用横向扩展。