Erlang 热代码加载没有被广泛使用?
Erlang Hot Code Loading not widely used?
我刚刚从 LinuxConf.au 看到 this 2012 video 关于生产中的 Erlang。
视频中有一部分 Bernard 说,除了 Ericsson 之外,没有任何大型 Erlang 项目使用热代码加载,因为很难保证一切正常。大约 minute 29.
现在还是这样吗?现在是否有工具可以帮助测试热代码加载或使其更容易?
这不是真的。每个 Erlang 用户都以一种或另一种方式使用热代码加载来发挥自己的优势——无论是用于开发、测试、故障排除、一次性修复还是全面部署。这是 Erlang 的主要优势之一。也比较独特。
例如,最大的 Erlang 用户之一 WhatsApp 几乎所有的代码推送都依赖热代码加载。
我个人曾在每个更改都很好理解并且通常由进行更改的同一个人执行的场景中处理过热代码加载。它工作得非常好,优秀的工程师这样做没有任何问题。说到工具,使用 l(...).
从 Erlang shell 一个接一个地加载模块,或者使用 l().
一次加载所有模块(参见 here) works just fine. Some prefer release-based tools like relx.
爱立信等其他公司在对明确的版本和补丁进行严格测试后,使用带有热代码加载的企业式部署。这里的目标是在不使用备用容量和特殊程序的情况下进行升级,以耗尽和转移负载。在操作上,这可能比重新启动更简单、更有效,但测试可能更昂贵。
很难知道它是广泛使用还是很少使用的功能。现在有很多 Erlang 系统。但是,我可以想到为什么以及为什么不使用它的原因,因为我使用机器人选项已经有一段时间了。
赞成使用它:
- 在开发过程中确保快速反馈周期显然非常有用。我总是使用开放的 shell 进行开发,并具有在编译时自动加载代码的功能。
- 在极少数情况下,您需要实现具有高可用性要求的单体应用程序,它基本上是唯一的选择
不使用它的主要原因,如演示文稿所述:它很难。即使您设法准确理解它是如何工作的(这不是最难的部分)。
在我看来,这不仅仅是工具问题,而是因为现在您的代码是系统。你基本上最终会有一个很长的 运行ning 系统来改变行为,所以你将这些添加到你已经遇到的问题中:
- 您不再确定重启系统不会从根本上改变行为。因此,您可能需要格外小心,确保无论您加载什么代码,它也会写入磁盘。
- 改变模块的工作方式(即加载新代码)非常棘手,除非 a) 你永远不会破坏兼容性,b) 你以某种方式弄清楚模块应该改变的顺序,或者 c) 你假设最坏的情况可能发生的是由于未定义的函数、函数或 case 子句等导致的一些崩溃,并希望最好(实际最糟糕的是当新旧模块以意想不到的方式交互而您尚未完成所有新模块的加载时实际上 运行 一些 不可能的 逻辑)。
- 你几乎肯定会在某些时候加载新代码时终止一些进程运行宁旧代码。也许你的主管会帮助你,也许不会。在任何情况下都可能非常混乱且难以调试。
- 正如演示文稿中所述,很难测试(如果不是不可能的话)。
等等
除此之外,您正在 运行 建立一个具有长寿命状态的长寿命服务器,这远非理想。
所以我的建议始终是,如果你可以摆脱分布式应用程序和滚动升级,你应该这样做。该选项更容易处理,根据我的经验,整体表现更好。
我刚刚从 LinuxConf.au 看到 this 2012 video 关于生产中的 Erlang。
视频中有一部分 Bernard 说,除了 Ericsson 之外,没有任何大型 Erlang 项目使用热代码加载,因为很难保证一切正常。大约 minute 29.
现在还是这样吗?现在是否有工具可以帮助测试热代码加载或使其更容易?
这不是真的。每个 Erlang 用户都以一种或另一种方式使用热代码加载来发挥自己的优势——无论是用于开发、测试、故障排除、一次性修复还是全面部署。这是 Erlang 的主要优势之一。也比较独特。
例如,最大的 Erlang 用户之一 WhatsApp 几乎所有的代码推送都依赖热代码加载。
我个人曾在每个更改都很好理解并且通常由进行更改的同一个人执行的场景中处理过热代码加载。它工作得非常好,优秀的工程师这样做没有任何问题。说到工具,使用 l(...).
从 Erlang shell 一个接一个地加载模块,或者使用 l().
一次加载所有模块(参见 here) works just fine. Some prefer release-based tools like relx.
爱立信等其他公司在对明确的版本和补丁进行严格测试后,使用带有热代码加载的企业式部署。这里的目标是在不使用备用容量和特殊程序的情况下进行升级,以耗尽和转移负载。在操作上,这可能比重新启动更简单、更有效,但测试可能更昂贵。
很难知道它是广泛使用还是很少使用的功能。现在有很多 Erlang 系统。但是,我可以想到为什么以及为什么不使用它的原因,因为我使用机器人选项已经有一段时间了。
赞成使用它:
- 在开发过程中确保快速反馈周期显然非常有用。我总是使用开放的 shell 进行开发,并具有在编译时自动加载代码的功能。
- 在极少数情况下,您需要实现具有高可用性要求的单体应用程序,它基本上是唯一的选择
不使用它的主要原因,如演示文稿所述:它很难。即使您设法准确理解它是如何工作的(这不是最难的部分)。
在我看来,这不仅仅是工具问题,而是因为现在您的代码是系统。你基本上最终会有一个很长的 运行ning 系统来改变行为,所以你将这些添加到你已经遇到的问题中:
- 您不再确定重启系统不会从根本上改变行为。因此,您可能需要格外小心,确保无论您加载什么代码,它也会写入磁盘。
- 改变模块的工作方式(即加载新代码)非常棘手,除非 a) 你永远不会破坏兼容性,b) 你以某种方式弄清楚模块应该改变的顺序,或者 c) 你假设最坏的情况可能发生的是由于未定义的函数、函数或 case 子句等导致的一些崩溃,并希望最好(实际最糟糕的是当新旧模块以意想不到的方式交互而您尚未完成所有新模块的加载时实际上 运行 一些 不可能的 逻辑)。
- 你几乎肯定会在某些时候加载新代码时终止一些进程运行宁旧代码。也许你的主管会帮助你,也许不会。在任何情况下都可能非常混乱且难以调试。
- 正如演示文稿中所述,很难测试(如果不是不可能的话)。
等等
除此之外,您正在 运行 建立一个具有长寿命状态的长寿命服务器,这远非理想。
所以我的建议始终是,如果你可以摆脱分布式应用程序和滚动升级,你应该这样做。该选项更容易处理,根据我的经验,整体表现更好。