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

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

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

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

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


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

首先,让我们从一些背景开始。 Erlang虚拟机及其标准库是为构建分布式系统而预先设计的,而且这真的显示出来了。 据我所知,它是在这个用例的前期设计的生产中广泛使用的唯一运行时和虚拟机。

应用

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

  • 作为单位启动和停止。 启动和停止系统是一个启动所有应用程序的问题
  • 提供统一的目录结构和配置API(不是XML!)。 如果您已经使用并配置了OTP应用程序,那么您就知道如何与其他任何应用程序一起工作
  • 包含您的应用程序监督树,所有进程(通过进程我的意思是“虚拟机进程”是轻量级的计算线程)及其状态
  • 这种设计的影响是巨大的。 这意味着Elixir开发人员在编写应用程序时有更明确的方法:

  • 他们的代码如何启动和停止
  • 组成应用程序的过程是什么,因此应用程序状态是什么
  • 如果这些进程会在出现崩溃或出现问题时作出反应并受到影响
  • 不仅如此,围绕这种抽象的工具非常棒。 如果安装了Elixir,请打开“iex”并输入:observer.start() 。 除了显示关于您的实时系统的信息和图表,您还可以杀死随机进程,查看其内存使用情况,状态等等。 这是一个在Phoenix应用程序中运行这个例子的例子:

    观察者使用Phoenix应用程序运行

    这里的区别在于Applications和Processes为您提供了一个抽象的理由来推理您的代码在生产中 。 许多语言主要针对代码组织提供程序包,对象和模块,而没有反映运行时系统。 如果你有一个类属性或者一个单例对象:你如何推理可以操作它的实体? 如果你有内存泄漏或瓶颈,你怎么能找到负责它的实体?

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

    通讯

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

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

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

    如果你想使用HTTP和JSON,那也没关系,像Phoenix这样的插件和框架库也会保证你在这里也很有成效。

    微服务

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

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

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

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

    链接地址: http://www.djcxy.com/p/30147.html

    上一篇: Where does Elixir/erlang fit into the microservices approach?

    下一篇: Project layout with vagrant, docker and git