光束向前行进

2020-10-28 10:06:06

BEAM是Erlang和Elixir在其上运行的虚拟机。它被广泛引用为一款经过战斗考验的软件,尽管我不知道它在哪些战争中见过行动。它肯定已经在电信领域以及Whatsapp和Discorde等全球规模的项目上付出了代价。它非常适合于处理具有高并发性的软实时分布式系统。它一直是一个很好的平台,一直在嘎嘎作响。由于爱立信的一个小团队负责其大部分持续发展,该公司一直以非常务实的方式进行管理。Erlang一直都有一点秘密和默默的成功。如果你看看市场份额,几乎没有人使用它。但在使用它的国家中,似乎有一个非常积极的共识。然后长生不老药出现了,引起了一点轰动。我认为光束得益于长生不老之药,没有长生不老之药就不会有长生不老之药。有了这个背景,我想让大家了解一些很酷的发展,我认为这些发展会让光束在未来变得更有趣,甚至是独一无二的有趣。

随着OTP24在明年的某个时候着陆,我们将获得光束的JIT。基于AsmJit项目,这意味着一些BEAM代码将被翻译成本机指令。它不会是我在PyPy中听说过的那种性能提升的预热JIT,但要简单得多。该项目的目标是引入JIT,该JIT可以在某些情况下提高性能,但不会导致任何性能倒退。一种务实而值得称赞的方法。考虑到这使得Jason JSON-library(用Elixir编写)在某些测试中击败了Jiffy JSON-library(编写为C NIF),我认为这有可能消除对某些NIF实现的需求。避免接触功能更强但更危险的低级代码是一个很好的胜利。

运行RabbitMQ的任何人都应该期待更新,因为测量显示消息吞吐量增加了30-50%。这是一件很好的事情,因为根本不需要更改代码。

把光束的性能推向更接近原生的水平是非常棒的。明确地说,光束已经是一个相当好的表演者了。我会将Erlang和Elixir放在Python/Ruby/Node.js等语言的抽象级别。Python和Ruby表现不佳。为了提高性能,Python ML的所有内容都采用了C++或类似的语言。我用过很多次Python,我从Ruby世界听到的东西让它们在性能上听起来相当相似。他们有点慢,一次只能做一件事。Js有点不同。如果你加上星号和斜视,它可以一次做多件事。它的工作方式与Python+Gevent大体相同。这种方法非常容易受到CPU限制的工作的影响,从而导致队头阻塞。它成为构建高性能应用程序的唯一最重要的考虑因素,“达到IO,而不是计算”。运行Node.js的V8针对这样一种动态语言进行了大量优化且速度很快。我认为光束提供了一种更好的方法,可以提供类似的结果,而不需要那么多的步枪(开枪打自己的脚的机会)。但是,在这个JIT实现中,在原始处理方面变得更好是一个很大的收获,我期待着这个版本的发布。

Lumen项目是一群开源开发人员和造船厂为实现编译器(以及更多)所做的巨大努力,该编译器可以将Elixir和Erlang带入浏览器。通过解决这个问题,他们最终也解决了Erlang和Elixir的静态编译问题。因此,这并不是编译光束并将其传送到浏览器。这是以允许静态编译的方式忠实地重新实现BEAM功能。它使用LLVM,在开发和讨论Web Assembly工作组过程方面都需要付出相当大的努力,以确保该标准不完全由面向对象的编程需求运行。

我不认为卢门会取代横梁。BEAM在长期运行的服务和分布式计算方面有着辉煌的记录,而Lumen项目目前甚至没有尝试实现这些记录。相反,Lumen项目将允许Elixir和Erlang移动到光束可能有点重的空间,并仍然提供相同的保证。通常我认为它对命令行工具、Web前端(考虑到Actor模型非常有趣)、无服务器/边缘计算以及WASM与Docker竞争作为Kubernetes中的代码交付机制都很有好处,使用类似Krustlet的东西(WASM/Krustlet上很好的播客剧集)。可能是“云原住民”之类的。谁知道呢。

使Lumen有可能更好地适应这些环境的是,它可以针对文件大小进行优化(通过减少热代码更新),而且启动速度可能会快得多。流明是用铁锈写的。据我所见,这似乎是Web Assembly的流行选择。流明仍然是一个早期发布的项目,不适合生产。但

除此之外,默认设置在默认情况下编码了许多良好的嵌入式实践,这样您就可以避免使用固件更新来阻塞设备,可以轻松地支持通过网络或USB等方式推送固件。

有大量用于传感器和各种硬件的好库,以及通用协议,如GPIO/SPI/I2C/UART。网络支持是经过深思熟虑的,自从几年前我第一次开始使用神经(当时它也很管用)以来,我一直在重新设计网络支持。BLE最近得到了越来越多的支持。

该项目还创建了NervesHub,这是一种通过安全地提供固件更新来管理设备群的解决方案,允许在您的产品需要时打开设备上的远程控制台。我认为最新的事情是对UI进行了修改,并对二进制差异补丁进行了一些认真的工作,以最大限度地减少数据受限部署的固件更新大小。

这在很大程度上是一个生产项目,人们正在紧张地运送硬件。它一直在前进。

SAša Jurić是广受好评的“行动中的灵丹妙药”一书的作者,他制作了一个名为SITE_ENCRYPT的图书馆。它允许您在不单独的Web服务器或实际使用certbot的情况下处理LetsEncrypt配置。

现在,这个库本身就很好,也很有意义,但背后的想法就是我为什么要提出它。梁可以是您的整个应用程序。随着时间的推移,我意识到了这一点。在Python中,你会让Gunicorn来运行你的Django应用程序,而Nginx来保护Gunicorn免受巨大的邪恶世界的伤害。横梁就是为这个做的。引入中间层的Nginx(或另一个HTTP服务器)实际上可能是有害的,因为您现在需要正确配置两件事,以及两个多核处理工作者池,它们关心这个请求/响应周期,并且可能独立地将其搞砸。

横梁总是为此建造的。OTP有很多奇怪的地方,你可以在那里找到有趣的库,比如wx for WxWidgets(窗口管理)和ssh for SSH客户机和服务器工作,我相信。因为它是作为一个完整的解决方案交付的。它可以在其中运行和管理多种不同类型的工作。优雅地。对于大型部署或多语言环境,它不能取代Kubernetes。但这很可能意味着你实际上不需要提前去那里。或者,您可以减少开发人员所需的运维数量。如果您的整个堆栈从前到后是Elixir或Erlang,我认为您已经大大增强了开发人员的能力。

我们已经朝着这个方向迈进了一步,工具正在汇聚,这为我们提供了许多开箱即用的东西,否则我们就需要将它们移出我们的应用程序。这些都是务实的80-90%的解决方案。正常的解决方案仍然都在那里,如果您需要使用它们的话。但也许你不知道。我认为这些动作都是一样的:

LiveView-我们可以减少我们需要构建的非光束代码(Elixir或Erlang)的前端的数量,在某些情况下完全摆脱它。

实时仪表板-将应用程序洞察直接放在您的应用程序堆栈中,而不是将其推送到另一个解决方案中。

凤凰现身-分发现身。CRDT支持的东西,用于维护某人是否连接到某个频道的信息,如聊天室和在线/离线。使用频道。

通过将解决方案保存在您非常了解的系统中来降低复杂性可能非常有效。在某种程度上,许多项目将需要拾取外部依赖项,如Nginx、Redis或其他任何东西。但是我认为在一个可以很好地完成所有任务的系统中构建您的应用程序有一些令人信服的地方。长生不老药和凤凰卫视已经在初创企业中占据了相当大的份额。如果这最终成为初创公司非常受欢迎的解决方案,我不会感到惊讶。没有MVP的前端特定代码,没有我们用Live Dashboard制作的新遗迹或Mixpanel账单。当我们需要时,分布是Erlang分布+群/部落/Libcluster或类似的东西。如果我们需要“实时”功能,我们就能很好地、真正地得到满足。

我认为这是一种务实的方法,符合Erlang一直努力成为的人,也符合Elixir最终成为的人,也符合社区中许多人的需求。我期待着看看它是否会像我希望的那样成长。我们将在即将播出的与saša Jurić一起播出的Elixir Mix(播客)节目中进一步讨论这个问题。所以要注意这一点。

我认为这本身可能是一个未来的话题。我还没说完呢。

虽然光束的能力令人难以置信,但艾力克希尔和二郎并不困难。从面向对象编程到函数式编程通常会有一些坎坷。但除此之外,您主要是在Python之类的禁欲级别工作,而不需要注意类层次结构。我发现推理起来更容易些。这不是一件微不足道的事。一开始就没有编程。但你并不是在数学和抽象思维的疯狂领域工作。至少不是你需要关心的。就像编程不需要“擅长数学”一样。你不需要是某种铁杆高手才能用ELEXIR或Erlang来完成任务。长生不老药看起来像红宝石,如果有帮助的话。或者他们是这么说的。我从没做过露比。

它绝对比Node.js更容易推理,事件循环对我来说也是如此。

我对BEAM作为构建软件的运行时/虚拟机有很强的信心。当然,有些地方它不太合适。我主要从事Web服务开发,在那里非常适合。

如果你有想法、感觉,甚至“更多的评论”,请随时通过[email protected]或通过我的Twitter@lawik联系。如果你有兴趣继续写作,我的时事通讯在下面。