gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:33:17 25 4
gpt4 key购买 nike

关闭。这个问题需要更多focused .它目前不接受答案。












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

6年前关闭。



Improve this question




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

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

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

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

最佳答案

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

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

应用

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

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

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

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

    Observer running with a Phoenix application

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

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

    沟通

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

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

    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 分布式协议(protocol)运行所有这些,你可以在不同的节点上运行它们,只要你通过 {:node@network, :name} 引用它们,它们就可以到达其他节点。而不是 :name .

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

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

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com