分布式平台的核心在于并发,容错。 而 Elixir 的优点正是在于对于并发和容错的处理。html
对于 CSP 来讲,重点在与 channel,经过 channel 管理并发的任务,并不关心执行任务的执行者。 Actor 模型关心的是任务的执行者(也就是 Actor),每一个 Actor 都是能够经过消息和外界交互,根据消息完成任务。golang
Elixir 采用的是 Actor 模型,golang 的并发是 CSP 模型。并发
并行(concurrency)常常会和并行(parallelize)的几率混淆,并发是指同时发生,并行是指同时运行, 好比,在一个 4core 的机器上,并发的量可能上万,可是并行可能只有 4。分布式
Elixir 的并发是由 BEAM VM 来管理的,理论上,一个 BEAM VM 上能够建立 268,000,000 个进程,基本就能够当作是无限制。 通常来讲,BEAM VM 都是经过少许的调度进程来管理大量的 processes Elixir 的并发进程之间不会共享任何东西(包括内存在内)。code
对错误的处理方式,最广泛的就是 try/catch,这种方式对于单机的系统来讲能够适用,可是对于分布式系统来讲,存在不足之处:htm
Elixir 中也有相似 try/catch 的机制,可是它的容错性不是依靠这种机制来保证的。 Elixir 不是致力于去减小错误的发生,而是致力于提供一种机制去减小错误的影响,并使得系统可以本身从错误中恢复。blog
Elixir 中经过进程树来确保整个应用的可用性,少数几个进程做为 supervisor,用来监管其余完成实际业务的进程。 若是进程出现问题,由 supervisor 进程负责重启或者销毁。进程
除了进程树,对于分布式系统的容错,Erlang 的理念是 let it crash 缘由也就是由于在分布式系统中,不少的错误和环境相关,难于重现,而且不少时候在错误的基础上恢复系统至关困难, 远远没有直接重启来的简单有效。内存
固然,let it crash 不是 let everything crash,如下状况仍是要处理:get
- 对于关键性的进程,是绝对不能让它 crash 的,好比有些主干上的 supervisor - 能够预期的错误,就要有对应的错误处理,不能什么都靠重启来解决 - let it crash 是指把那些没法预期的错误交给 supervisor 来处理
OTP 平台的分布式系统核心是 process 和 message Elixir 自己也能够实现很是健壮的分布式系统,可是借助 OTP 平台上已经成熟的组件,能够更快的建立一个分布式应用
下面是 OTP 平台上提供的成熟组件:(各个组件的示例参考:http://www.cnblogs.com/wang_yb/p/5589257.html)