Closed. This question needs to be more focused。它当前不接受答案。












想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。

5年前关闭。



Improve this question




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

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

例如,如果我要使用docker,因为它提供了dev-prod奇偶校验,那么elixir怎么适合呢?鉴于Docker容器是不可变的,我将失去执行热代码升级的能力,对吗?蓝色/绿色部署或Canary版本又如何呢?

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

最佳答案

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

首先,让我们从一些背景开始。 Erlang VM及其标准库是为构建分布式系统而预先设计的,这确实可以证明这一点。据我所知,它是在生产环境中为此用途预先设计的唯一运行时和VM。

应用 Realm

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

  • 作为单元启动和停止。启动和停止系统是启动系统中所有应用程序的问题
  • 提供了统一的目录结构和配置API(不是XML!)。如果您已经使用并配置了OTP应用程序,那么您将知道如何使用其他
  • 包含您的应用程序监视树,其中包含所有进程(按进程,我的意思是“VM进程”,它们是轻量级的计算线程)及其状态

  • 这种设计的影响是巨大的。这意味着Elixir开发人员在编写应用程序时可以采用更明确的方法来:
  • 他们的代码如何启动和停止
  • 构成应用程序一部分的进程是什么,因此应用程序状态
  • 是什么
  • 如果发生崩溃或出现问题,这些过程将如何 react 并受到影响

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

    此处的区别在于,应用程序和流程为您提供了抽象,以便您对生产中的代码进行推理。许多语言提供的包,对象和模块主要用于代码组织,而对运行时系统没有影响。如果您具有类属性或单例对象:如何推理可以操纵它的实体?如果您有内存泄漏或瓶颈,如何找到造成此问题的实体?

    如果您要求运行分布式系统的任何人,这就是他们想要的洞察力,而使用Erlang/Elixir则可以将其作为构建基块。

    通讯

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

    使用Erlang/Elixir,您已经可以立即使用通信协议(protocol)和序列化机制。如果要使两台计算机相互通信,则只需给它们命名,确保它们具有相同的 secret 即可。

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

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

    微服务

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

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

    而且,归根结底,如果您使用Erlang Distributed Protocol运行所有这些,则可以在不同的节点上运行它们,只要您通过{:node@network, :name}而不是:name引用它们,它们就可以到达其他节点。

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

    关于architecture - Elixir/erlang在哪里适合微服务方法? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30422184/

    10-10 17:00