Elixir 分布式平台

概述

分布式平台的核心在于并发,容错。 而 Elixir 的优点正是在于对于并发和容错的处理。html

分布式模型

  1. CSP(Communicating Sequential Process) 模型 :: 多个进程经过管道(channel)进行交互
  2. Actor 模型 :: 每一个进程管理本身的内部状态,经过消息和外界交互

对于 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

  • 分布式系统涉及多个系统间的交互,try/catch 只能在单点上捕获异常
  • 分布式系统中可能发生的错误每每很难重现,也没法预测,即便捕获到异常,也很难预置处理方式,也就是不少异常会致使系统没法恢复
  • try/catch 机制通常都是捕获错误,而后本身处理或者直接往上层抛异常,随着系统的复杂,异常的层级也会愈来愈多

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 平台

OTP 平台的分布式系统核心是 processmessage Elixir 自己也能够实现很是健壮的分布式系统,可是借助 OTP 平台上已经成熟的组件,能够更快的建立一个分布式应用

下面是 OTP 平台上提供的成熟组件:(各个组件的示例参考:http://www.cnblogs.com/wang_yb/p/5589257.html)

  1. agent
  2. GenServer
  3. GenEvent
  4. task
  5. supervisor
相关文章
相关标签/搜索