Architecture Elixir/erlang在哪里适合微服务方法?

Architecture Elixir/erlang在哪里适合微服务方法?,architecture,erlang,docker,elixir,microservices,Architecture,Erlang,Docker,Elixir,Microservices,最近我一直在用docker compose做一些实验,以便部署多个协作微服务。我可以看到微服务提供的许多好处,现在有了一个很好的工具集来管理它们,我认为跳入微服务的行列并不十分困难 但是,我也一直在试验长生不老药,我很喜欢它本身带来的好处。考虑到它鼓励您将代码打包到多个解耦的应用程序中,并支持热代码升级,您将如何将docker与elixir(或erlang)混合使用 例如,如果我想使用docker,因为它提供了dev-prod奇偶校验,那么elixir如何适应这种情况?考虑到docker容器是不

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

但是,我也一直在试验长生不老药,我很喜欢它本身带来的好处。考虑到它鼓励您将代码打包到多个解耦的应用程序中,并支持热代码升级,您将如何将docker与elixir(或erlang)混合使用

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


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

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

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

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

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

  • 他们的代码是如何启动和停止的
  • 构成应用程序一部分的流程是什么?因此,应用程序的状态是什么
  • 在发生碰撞或出现问题时,这些过程将如何反应并受到影响
  • 不仅如此,围绕此抽象的工具非常棒。如果您安装了Elixir,请打开“iex”并键入:
    :observer.start()
    。除了显示有关实时系统的信息和图形外,您还可以杀死随机进程,查看其内存使用情况、状态等。以下是在Phoenix应用程序中运行此功能的示例:

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

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

    沟通 所有这一切都只是一个开始。在构建分布式系统时,需要选择通信协议和数据序列化程序。很多人选择HTTP和JSON,当你想到这一点时,它们是执行真正的RPC调用的非常详细和昂贵的组合

    使用Erlang/Elixir,您已经有了一个现成的通信协议和序列化机制。如果您想让两台机器相互通信,只需给它们命名,确保它们具有相同的机密,就可以了

    Jamie在Erlang Factory 2015上谈到了这一点,以及他们如何利用这一点构建游戏平台:

    如果您想使用HTTP和JSON,这也很好,像Plug这样的库和Phoenix这样的框架也可以保证您在这里的工作效率

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

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

    最后,如果您使用Erlang分布式协议运行所有这些,您可以在不同的节点上运行它们,只要您通过
    {:node@network,:name}
    而不是
    :name


    我可以更进一步,但我希望在这一点上我已经说服了你。

    我知道否决票是因为这个问题“没有显示任何研究成果”。这是可悲的,因为这不是真的,当然问题可能在于问题本身,但我知道