Elixir / erlang适用于微服务方法?

最近我一直在做一些Docker撰写的实验,以部署多个协作的微服务。 我可以看到微服务提供的许多好处,现在有一个很好的工具来pipe理它们,我认为跳进微服务并不难。

但是,我也一直在试验Elixir,而且我非常喜欢自己提供的好处。 鉴于它鼓励将代码打包到多个分离的应用程序中,并支持热码升级,那么如何将docker与elixir(或erlang)混合?

例如,如果我想使用docker,因为它提供dev-prod奇偶校验,那么elixir如何适应呢? 鉴于docker集装箱是不可变的,我失去了进行热码升级的能力,对吧? 蓝色/绿色部署或金丝雀版本呢?

我的意思是,我可以用Elixir写微服务,就像用其他语言写的一样,polyglotism是微服务的好处之一,但是我没有得到使用OTP平台的全部好处,我猜测纯粹的协作erlang应用程序是更好的方式,使用中间队列在用不同(或不是)语言编写的微服务之间进行通信。

这是一个非常开放的问题,但我会试着说明为什么Elixir / Erlang可能是开发分布式系统的最佳平台(不pipe你是否正在使用微服务)。

首先,让我们从一些背景开始。 Erlang虚拟机和它的标准库是为构build分布式系统而devise的,而这真的出现了。 据我所知,这是用于这种用例的前期生产中唯一广泛使用的运行时和虚拟机。

应用

例如,你已经暗示了“应用程序”。 在Erlang / Elixir中,代码封装在以下应用程序中:

  1. 以单位开始和停止。 启动和停止系统是一个启动所有应用程序的问题
  2. 提供统一的目录结构和configurationAPI(不是XML!)。 如果您已经使用过并configuration了一个OTP应用程序,那么您就知道如何与其他应用程序一起工作
  3. 包含您的应用程序监督树,所有进程(我的意思是“虚拟机进程”是轻量级的计算线程)和他们的状态

这种devise的影响是巨大的。 这意味着Elixir开发人员在编写应用程序时有一个更明确的方法:

  1. 他们的代码是如何启动和停止的
  2. 什么是组成应用程序的过程,因此应用程序状态是什么
  3. 如果这些进程会发生崩溃或出现问题,这些进程将如何反应并受到影响

不仅如此,围绕这个抽象的工具是伟大的。 如果你安装了Elixir,打开“iex”并input:observer.start() 。 除了显示关于您的实时系统的信息和图表,您可以杀死随机进程,查看其内存使用情况,状态等等。 下面是一个在Phoenix应用程序中运行的例子:

观察者运行一个凤凰应用程序

这里的区别是应用程序和进程给你一个抽象的理由在生产中的代码 。 许多语言主要为代码组织提供程序包,对象和模块,而不在运行时系统上进行反思。 如果你有一个类属性或者一个单例对象:你怎么能够推断可以操纵它的实体呢? 如果你有内存泄漏或瓶颈,你怎么能find负责的实体?

如果你问任何一个运行分布式系统的人,那就是他们想要的洞察力,而用Erlang / Elixir你就可以把它作为构build模块。

通讯

所有这些只是真正的开始。 在构build分布式系统时,需要select通信协议和数据串行器。 很多人selectHTTP和JSON,当你想到的时候,它是一个非常冗长和昂贵的组合,用于执行真正的RPC调用。

使用Erlang / Elixir,你已经拥有了一个开箱即用的通信协议和序列化机制。 如果你想让两台机器相互通信,你只需要给他们一个名字,确保他们有相同的秘密,然后就完成了。

Jamie在Erlang Factory 2015上谈到了这个问题,他们如何利用这个技术来构build一个游戏平台: https : //www.youtube.com/watch?v=_i6n-eWiVn4

如果你想使用HTTP和JSON,那么也可以,像Phoenix这样的插件和框架库也能保证你在这里也很有成效。

微服务

到目前为止,我还没有谈到微服务。 这是因为,到目前为止,他们并不重要。 您已经在围绕非常微小的独立进程devise您的系统和节点。 如果你愿意的话,给他们打电话nanoservices!

不仅如此,它们也被打包成应用程序,将它们分组为可以作为单元启动和停止的实体。 如果您有应用程序A,B和C,然后您想将它们部署为[A,B] + [C]或[A] + [B] + [C],则这样做会很麻烦到他们固有的devise。 或者,更好的是,如果您希望避免将微服务部署的复杂性预先添加到系统中,则可以将其部署在同一个节点中。

而且,在一天结束的时候,如果你使用Erlang分布式协议运行所有这些,你可以在不同的节点上运行它们,只要你通过{:node@network, :name}而不是:name

我可以走得更远,但是我希望在这一点上我已经说服了你。 🙂