分布式基础
Erlang的分布式基础主要给予两个基本特性:
- 复制式进程间通信
- 位置透明性
复制式进程间通信
在解决两段并发执行的代码段之间的通信问题时, 最常用的模式就是让这两段代码共享某块内存, 前提是他们都在同一台机器上运行. 这种模式存在的问题之一就是, 当你希望每段代码都运行在独立的机器上时 就必须换用一种完全不同的通信方式, 代码中的很大一部分都需要被迫重写.
对于Erlang来说, 要想在通信透明化的同时构建出容错的系统, 要想让一台机器不至于因为相邻的机器崩溃或者机器间的网络故障而宕机, 就必须抛弃共享.
Erlang的进程间通信采用的是严格的异步消息传输(发送消息后无需等待网络上的确认), 接收方得到数据时实际上获取了数据的一份独立的副本. 此后接收方将无法感知发送方对数据所做的任何操作, 反之亦然. 后续的任何通信都必须借助额外的消息才能进行. 无论是运行在同一台机器上的进程还是运行在不同机器上并通过网络互联的进程, 这种模式都非常奏效.
在Erlang中没有共享, 只有消息传递, 因此分布式还是单机本质上没有什么区别. 大部分代码完全不用关心进程最终在何处运行.
然而在进行网络通信时仍然有很多需要注意的问题. 在使用本地通信时, 只要接收方进程还“活着“, 消息就一定能送达, 而且几乎没有传输延迟. 然而在网络中, 就不得不考虑路由过程中的消息延迟一集网络本身的故障了. 发送方通常无法辨别接收方到底是崩溃了还是因自身的bug而未能给出应答. 出于健壮性考虑, 即使采用本地通信, 发送方也应该对这些故障有所准备. 但在分布式系统中总会存在多种导致不确定性行为的因素.
位置透明性
发送运算符具有位置透明的属性, 接收方在哪台机器上并不重要, 只因消息走向的信息都隐含在进程标识符之中. Erlang会确保进程标识符在多机网络上的唯一性.