【问题标题】:Where does Elixir/erlang fit into the microservices approach? [closed]Elixir/erlang 在哪里适合微服务方法? [关闭]
【发布时间】:2015-08-05 23:32:26
【问题描述】:

最近我一直在使用 docker compose 进行一些实验,以便部署多个协作微服务。我可以看到微服务提供的许多好处,而且现在有一个很好的工具集来管理它们,我认为跳入微服务的行列并不难。

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

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

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

【问题讨论】:

  • 我看到投反对票是因为问题“没有显示任何研究工作”。这很可悲,因为这不是真的,当然问题可能出在问题本身上,但不能指责我没有研究,因为这是我最近一直在做的唯一事情。很多。
  • 这个问题太宽泛了——关于stackoverflow的问题是为了包含具体问题。
  • 我应该把它移到另一个 stackexchange 站点吗?因为问题是合法的 IMO。
  • 我认为这是一个有趣的问题,但可能属于程序员 stackexchange?话虽如此,不投票结束
  • 太棒了,完全适合这份工作。

标签: architecture erlang docker elixir microservices


【解决方案1】:

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

首先,让我们从一些背景开始。 Erlang VM 及其标准库是为构建分布式系统而预先设计的,这确实很明显。据我所知,它是唯一一个在生产环境中广泛使用的运行时和虚拟机,为这个用例预先设计。

应用程序

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

  1. 作为单元启动和停止。启动和停止系统就是启动其中的所有应用程序
  2. 提供统一的目录结构和配置API(不是XML!)。如果您已经使用并配置过 OTP 应用程序,那么您就知道如何使用其他任何应用程序
  3. 包含您的应用程序监督树、所有进程(我所说的进程是指轻量级计算线程的“VM 进程”)及其状态

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

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

不仅如此,围绕这种抽象的工具也很棒。如果您安装了 Elixir,请打开“iex”并输入::observer.start()。除了显示有关您的实时系统的信息和图表外,您还可以终止随机进程,查看它们的内存使用情况、状态等。这是在 Phoenix 应用程序中运行的示例:

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

如果你问任何运行分布式系统的人,这就是他们想要的那种洞察力,而对于 Erlang/Elixir,你就有了这种洞察力。

通讯

这一切真的只是一个开始。构建分布式系统时,需要选择通信协议和数据序列化器。很多人选择 HTTP 和 JSON,仔细想想,这对于执行真正的 RPC 调用来说是一种非常冗长且昂贵的组合。

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

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

如果您想使用 HTTP 和 JSON,那也很好,Plug 之类的库和 Phoenix 之类的框架将保证您在这里也能高效工作。

微服务

到目前为止,我还没有谈到微服务。那是因为,到目前为止,它们并不重要。您已经在围绕非常小的孤立进程设计系统和节点。如果您愿意,可以将它们称为纳米服务!

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

而且,归根结底,如果您使用 Erlang 分布式协议运行所有这些,您可以在不同的节点上运行它们,只要您通过 @987654324 引用它们,它们就可以到达其他节点@ 而不是 :name

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

【讨论】:

  • 其实我非常喜欢 Elixir 和 OTP,问题更多是关于如何在使用 Elixir 的同时获得微服务的一些好处(如 dev-prod parity、canary 版本等)。
  • 我有一段关于 Docker 的文章,但它丢失了。 :) 要点是您将它用于节点部署,因此您可以选择每个节点有意义的应用程序。蓝/绿部署肯定是可以实现的,但取决于协议、状态类型和其他因素。
  • 我提到的演讲涵盖了可用于蓝/绿或金丝雀的路由层。同样,这取决于选择的协议,但您可以从分布式 Erlang 中的全局条目,使用 consul 的东西,或基于 HTTP 的 haproxy。
  • 服务发现方法很有意义。我想我一直在考虑负载平衡术语。
  • 微服务的其他好处之一是什么,例如为特定任务选择最佳语言。我喜欢 elixir,但它并不是每一项任务的最佳语言。我的意思是,一个特定的微服务可能需要使用不同的语言而不是长生不老药。那它还应该遵循传统的微服务架构吗?
猜你喜欢
  • 2014-03-31
  • 2015-01-17
  • 1970-01-01
  • 2016-11-29
  • 2010-12-10
  • 2015-10-12
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
相关资源
最近更新 更多