Erlang / Elixir在Docker和Hot Code Swap上

Erlang的特点之一(和定义,Elixir)是你可以做热代码交换。 然而,对于Docker来说,这似乎很奇怪,在那里你需要停止你的实例,并用保存新代码的新图像重新启动新实例。 这似乎是每个人都做的。

这就是说,我也知道有可能使用一个隐藏节点来将更新分发给networking上的所有其他节点。 当然,就像这样听起来像是在惹麻烦,但是…

我的问题如下:有没有人试过并取得了合理的成功,为Erlang / Elixirbuild立了基于Docker的基础架构,允许进行热码交换? 如果是这样,那么做什么,不该做什么和注意事项?

故事

设想一个系统来处理移动电话或移动数据访问(这是Erlang的创build)。 有网关服务器,在通话期间或数据访问会话(我将称之为会话前进)中维持用户会话。 只要会话处于活动状态(用户已连接),那些服务器就具有会话的内存中表示forms。

现在还有另一个系统计算用户对于呼叫或数据传输的费用(称之为PDF – 策略决策function )。 两个系统之间的连接方式使得网关服务器创build了一些TCP连接到PDF,并在TCP连接断开的情况下丢弃用户会话。 网关一次可以处理几十万个客户。 每当发生用户需要收费的事件(下一次数据传输,另一个通话时间),网关通知PDF事实,PDF从用户帐户中扣除特定金额。 当用户帐户为空时,PDF通知网关断开通话(您已经用完了,您需要充值)。

你的问题

最后让我们在这方面谈谈你的问题。 我们想升级一个PDF节点,并且节点在Docker上运行。 我们用新版本的软件创build了一个新的Docker实例,但是我们不能closures旧版本(在调用中间有成千上万的客户,我们不能断开它们)。 但是我们需要将客户从旧的PDF转移到新的版本。 所以我们告诉网关节点创build与更新的节点而不是旧的PDF的任何新的连接。 客户可能会喋喋不休,而且其中一些可能会有长时间运行的数据连接(下载Windows 10 iso),因此整个操作需要2-3天才能完成。 如果出现严重错误,则需要多长时间将软件版本升级到另一版本。 而像这样的服务器可能有数十台,每台服务器都有数以千计的客户。

但是如果我们使用Erlang版本处理程序呢? 我们使用新版本的软件创buildrelup文件。 我们正确testing并部署到PDF节点。 每个节点都就地升级 – 应用程序的内部状态被转换,节点正在运行新版本的软件。 但最重要的是,与网关服务器的TCP连接还没有被丢弃。 因此,客户可以继续通话,或者在升级系统时下载最新的Windows ISO。 全部在10秒内完成,而不是2-3天。

答案

这是具有特定要求的特定系统的示例。 Docker和Erlang的Release Handling是正交技术。 你可以使用其中一种,也可以同时使用两种,这一切归结为以下几点:

  • 要求
  • 成本

你是否有足够的资源来testing两种方法的可预见性和足够的耐心来教导你的行动小组,使他们能够使用任何一种方法部署系统? 如果testing设备花费数百万英镑(由于所需的硬件),并且一次只能使用这两种方法中的一种(因为testing周期需要几天)呢?

实用的方法可能是最初使用Docker部署节点,然后使用Erlang发布处理程序 (如果您首先需要使用Docker)升级它们。 或者,如果您的系统在升级过程中不需要可用(例如PDF系统),则可以select始终使用Docker部署新版本,并忘记发布处理。 或者你也可以坚持使用发布处理程序,并忘记Docker,如果你需要快速和可靠的更新,Docker将只用于初始部署。 我希望有帮助。