【问题标题】:Questions regarding umbrella app ~> Nano/micro services, Communication关于伞形应用程序的问题〜> 纳米/微服务,通信
【发布时间】:2017-02-25 09:55:37
【问题描述】:

-- 背景

我正在努力用 Elixir 替换我们当前 Rails REST API 的一些端点。我开始爱上了 Umbrella 的想法,它包含一个 HTTP 端点(一个 Phoenix 应用程序)和一组小型 nano 应用程序;可以是完全负责与用户数据交互的用户应用。

-- 问题

现在我希望能够独立扩展这些服务,比如用户服务的负载是否更大。我们在当前设置中使用 Docker,因此理想情况下我会部署更多用户应用容器。

这意味着我需要某种沟通方式,我目前使用 GenServer 创建了一个概念证明,效果很好,但似乎围绕着传递和改变状态的想法。而我只想传递一些数据,或者如果操作成功则回复:ok。 我看了http://elixir-lang.org/getting-started/mix-otp/task-and-gen-tcp.html,对我应该使用什么进行交流感到困惑。 那么我的第一个问题是,我的应用之间最理想的通信方式是什么?

我还偶然发现了另一个痛苦,在开发过程中我仍然需要我的应用程序一起交流,但这意味着我需要独立启动每个应用程序,并传递一个--cookie 和一个--sname。现在这很好,因为我只有 3 个应用程序,但是当我有 10 个时,这是很多工作。我知道我从伞根开始整个项目,但是,我如何将所需的参数传递给个人应用程序?

非常感谢一些许可。谢谢。

【问题讨论】:

  • 我不完全明白为什么“这意味着我需要某种沟通”,但只要你坚持 Erlang/Elixir 生态系统,elixir-lang.org/getting-started/mix-otp/… 可能更适合你想。参数传递,嗯,有更多方法可以给猫换皮——例如,您可以以编程方式启动分发系统,而不是为您完成它,请参阅erlang.org/doc/man/net_kernel.html。我觉得你的问题有点笼统,无法保证准确的答案。

标签: elixir


【解决方案1】:

Erlang 和关联的 Elixir 是使用内置于该语言的通信层创建的。使用伞形应用程序,您可以 build a release 最初将所有应用程序包含在单个节点中,然后由于需要针对伞形中的特定应用程序进行缩放,您可以为那些作为其他节点运行的应用程序构建一个版本(s )。

使用内置方法进行节点间通信并遵守一些规则将确保您无需更改现有代码即可将节点分发到不同的机器/VM。

请参阅this article 以获取试验节点间通信的说明。

对于理解 Erlang/Elixir 中的整体通信图很重要的其他概念:

http://erlang.org/doc/reference_manual/distributed.html

http://erlang.org/doc/man/epmd.html

http://erlang.org/doc/man/pg2.html

请记住,与 TCP 或 UDP 网络通信一样,第一个要求是机器必须能够通过网络进行通信,并且 Erlang VM 尝试使用的端口必须是开放的。

您可以在启动 Erlang/Elixir 应用程序时使用此命令行参数来限制使用的端口范围:

-kernel inet_dist_listen_min 30000 inet_dist_listen_max 30003

我相信您至少需要打开 2 或 3 个端口才能使其正常运行。

祝你好运!

【讨论】:

  • 太棒了,正是我想要的,谢谢杰森! :)
  • 没问题。我想补充一点,Elixir 中进程之间的通信方法与节点之间的通信方法相同,因为您仍然只是在进程之间(在不同节点上)进行通信。那个方法是Process.send
猜你喜欢
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
  • 2011-01-04
  • 2022-11-05
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多