- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
Erlang(根据定义,也就是 Elixir)的特性之一是您可以进行代码热交换。但是,这似乎与 Docker 不一致,您需要停止实例并使用包含新代码的新镜像重新启动新实例。这基本上似乎是每个人都在做的事情。
话虽如此,我也知道可以使用一个隐藏节点通过网络将更新分发给所有其他节点。当然,这样听起来像是自找麻烦,但是……
我的问题如下:有没有人尝试过为 Erlang/Elixir 建立一个允许热代码交换的基于 Docker 的基础架构并取得了相当大的成功?如果是,有哪些注意事项、注意事项和注意事项?
最佳答案
故事
想象一个系统来处理手机通话或移动数据访问(这就是创建 Erlang 的目的)。有网关服务器在通话期间维护用户 session ,或数据访问 session (我将其称为向前的 session )。只要 session 处于事件状态(用户已连接),这些服务器就会在内存中表示 session 。
现在有另一个系统可以计算向用户收取的通话费用或传输数据的费用(称为 PDF - Policy Decision Function)。两个系统的连接方式是网关服务器创建少量到 PDF 的 TCP 连接,如果这些 TCP 连接断开,它会丢弃用户 session 。网关一次可以处理几十万客户。每当发生需要向用户收费的事件(下一次数据传输,另一分钟的通话)时,网关都会通知 PDF 该事实,并且 PDF 从用户帐户中减去特定金额。当用户帐号为空时PDF通知网关断开通话(你的钱用完了,你需要充值)。
您的问题
最后让我们在这个背景下谈谈你的问题。我们要升级一个 PDF 节点并且该节点正在 Docker 上运行。我们用新版本的软件创建了一个新的 Docker 实例,但是我们无法关闭旧版本(有数十万客户在他们的通话中,我们无法断开他们的连接)。但是我们需要以某种方式将客户从旧 PDF 转移到新版本。因此,我们告诉网关节点创建与更新节点而不是旧 PDF 的任何新连接。客户可能很健谈,而且他们中的一些人可能有长时间运行的数据连接(下载 Windows 10 iso),因此整个操作需要 2-3 天才能完成。这是在出现严重错误时将软件的一个版本升级到另一个版本所需的时间。像这样的服务器可能有几十台,每台都处理数十万客户。
但是如果我们使用 Erlang 发布处理程序来代替呢?我们使用新版本的软件创建 relup 文件。我们对其进行正确测试并部署到 PDF 节点。每个节点都在原地升级——应用程序的内部状态被转换,节点正在运行新版本的软件。但最重要的是,与网关服务器的 TCP 连接并没有断开。因此,在我们升级系统的同时,客户可以愉快地继续通话或下载最新的 Windows iso。全部在 10 秒内完成,而不是 2-3 天。
答案
这是具有特定要求的特定系统的示例。 docker 和 Erlang's Release Handling是正交技术。您可以使用其中一个或两个,归结为以下几点:
您是否有足够的资源以可预测的方式测试这两种方法,并有足够的耐心来教导您的 Ops 团队,以便他们可以使用任何一种方法部署系统?如果测试设施耗资数百万英镑(因为需要硬件)并且一次只能使用这两种方法中的一种(因为测试周期需要几天时间)怎么办?
务实的方法可能是最初使用 Docker 部署节点,然后使用 Erlang release handler 升级它们(如果您首先需要使用 Docker)。或者,如果您的系统在升级期间不需要可用(如示例 PDF 系统所做的那样),您可能只是选择始终使用 Docker 部署新版本而忘记发布处理。或者,如果您需要快速可靠的即时更新并且 Docker 仅用于初始部署,您也可以坚持使用发布处理程序并忘记 Docker。我希望这会有所帮助。
关于docker - Docker 上的 Erlang/Elixir 和热代码交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36173583/
我想要类似于以下伪代码的东西: while input is not None and timer = 5: print "took too long" else: print inp
如何将 MainEngine Observable 转换为 Cold?来自这个例子: public IObservable MainEngine { get
自从手表被发明以来,表盘的方圆之争就始终没有停下来过,在漫长的岁月中,无论是方形还是圆形表盘,人们都为其寻找到足够多的设计元素,让其肆意成长,这种生机与活力后来也延续到了智能手表上,在2014年,这
我正在学习 CUDA,试图解决一些标准问题。例如,我正在使用以下代码求解二维扩散方程。但我的结果与标准结果不同,我无法弄清楚。 //kernel definition __global__ void
我的 Web 应用程序使用 native dll 来实现其部分功能(其位置在 PATH 中提供)。一切正常,直到我对 WAR 进行更改并且 JBoss 热部署此 WAR。此时dll已经找不到了,需要手
我看到这个问题here 。这是关于实现每个发出的项目的延迟。这是根据accepted answer如何实现的: Observable.zip(Observable.range(1, 5) .g
我最近一直在进行冷迁移...这意味着我无法在进行迁移时从应用程序级别读取/写入数据库(维护页面)。 这样就不会因为更改结构而发生错误,而且如果负载很大,我也不希望 mysql 在迁移过程中崩溃。 我的
我是一名优秀的程序员,十分优秀!