Docker上的Erlang/Elixir和热代码交换

Docker上的Erlang/Elixir和热代码交换,docker,erlang,elixir,Docker,Erlang,Elixir,Erlang(根据定义,Elixir)的一个特性是可以进行热代码交换。然而,Docker的情况似乎有些奇怪,在Docker中,您需要停止实例,并使用包含新代码的新图像重新启动新实例。这基本上似乎是每个人都在做的事情 话虽如此,我也知道可以使用一个隐藏节点通过网络将更新分发给所有其他节点。当然,这听起来像是自找麻烦,但是 我的问题是:是否有人尝试并取得了合理的成功,为Erlang/Elixir建立了一个基于Docker的基础设施,允许热代码交换?如果是这样的话,应该做什么、不应该做什么和注意事项是

Erlang(根据定义,Elixir)的一个特性是可以进行热代码交换。然而,Docker的情况似乎有些奇怪,在Docker中,您需要停止实例,并使用包含新代码的新图像重新启动新实例。这基本上似乎是每个人都在做的事情

话虽如此,我也知道可以使用一个隐藏节点通过网络将更新分发给所有其他节点。当然,这听起来像是自找麻烦,但是


我的问题是:是否有人尝试并取得了合理的成功,为Erlang/Elixir建立了一个基于Docker的基础设施,允许热代码交换?如果是这样的话,应该做什么、不应该做什么和注意事项是什么

设想一个处理移动电话呼叫或移动数据访问的系统(这就是创建Erlang的目的)。有一些网关服务器在通话期间维护用户会话或数据访问会话(我将称之为“继续进行的会话”)。只要会话处于活动状态(用户已连接),这些服务器就具有会话的内存表示形式

现在有另一个系统可以计算用户对通话或传输数据的收费(称之为PDF-)。这两个系统的连接方式都是这样的,网关服务器会创建一些到PDF的TCP连接,如果这些TCP连接中断,它会删除用户会话。网关一次可以处理几十万个客户。每当发生需要向用户收费的事件时(下一次数据传输,通话的另一分钟),网关会通知PDF有关此事实,PDF会从用户帐户中减去特定金额的钱。当用户帐户为空时,PDF通知网关断开呼叫(您的钱用完了,需要加满)

你的问题

最后,让我们在此背景下讨论您的问题。我们想升级PDF节点,该节点正在Docker上运行。我们用新版本的软件创建一个新的DOCKER实例,但是我们不能关闭旧版本(在他们的呼叫中有成千上万的客户,我们不能断开它们)。但我们需要以某种方式将客户从旧PDF转移到新版本。因此,我们告诉网关节点使用更新的节点而不是旧的PDF创建任何新连接。客户可能很健谈,而且其中一些可能有长时间运行的数据连接(下载Windows 10 iso),因此整个操作需要2-3天才能完成。这就是在出现严重错误的情况下,将软件的一个版本升级到另一个版本所需的时间。像这样的服务器可能有几十台,每台服务器处理数十万客户

但是如果我们改用Erlang发布处理程序呢?我们用新版本的软件创建了relup文件。我们正确地测试它并将其部署到PDF节点。每个节点都已升级到位-应用程序的内部状态已转换,节点正在运行新版本的软件。但最重要的是,与网关服务器的TCP连接尚未断开。因此,当我们升级系统时,客户很乐意继续拨打电话或下载最新的Windows iso。所有这些都是在10秒内完成的,而不是2-3天

答案

这是具有特定需求的特定系统的示例。Docker和Docker是正交技术。您可以使用其中一个,也可以同时使用这两个选项,这可以归结为以下几点:

  • 要求
  • 成本
您是否有足够的资源可预测地测试这两种方法,并有足够的耐心教导您的Ops团队,以便他们可以使用任何一种方法部署系统?如果测试设施花费数百万英镑(因为需要硬件),并且一次只能使用这两种方法中的一种(因为测试周期需要几天),该怎么办


实用的方法可能是最初使用Docker部署节点,然后使用升级(如果您首先需要使用Docker)。或者,如果您的系统在升级过程中不需要可用(例如PDF系统),您可以选择始终使用Docker部署新版本,而忽略发布处理。或者,如果您需要快速可靠的动态更新,您也可以坚持使用release handler,而忘记Docker,Docker将仅用于初始部署。我希望这能有所帮助。

回答得好,关于这个问题的文献很少,这是我的主要参考资料之一。Docker似乎无所不在,大多数CI工具和云提供商都在迎合它,我想说的是,对于大多数应用程序来说,使用Docker现在是一种不受欢迎的做法。然而,热代码交换功能非常有用,我建议每个人都尝试一下,并利用它实现一个用于计划外紧急更改的过程。谢谢@Aki,关于每个主题都有大量的文献。很少有文献讨论这两者,因为它们实际上不需要一起讨论。无论Erlang应用程序是使用Docker还是其他技术部署的,您都可以使用HCS。尽管我发表了评论,但我相信这还没有得到真正的回答。我相信,关于在Docker中使用HCS的不同实施策略,可以写得更多。我的猜测是,Docker与否并不重要,只要您保持PROD与HEAD对齐,新容器是否通过Docker或Erlang也不重要。但一定要保持同步!Docker并不特别适合Erlang——它只是部署当今许多年轻商店所知道的任何东西的唯一方法。大多数人试图用Docker解决的问题(轻量级并行、执行环境卫生、“网络就是抽象”、进程隔离、内存安全等)是Erlang alre的问题