发布网友 发布时间:2022-04-23 19:46
共1个回答
热心网友 时间:2022-04-19 02:43
Node.js 最适用的领域就是基于 TCP/UDP 的网络处理。这包括流量转发、统计、分析、变换。以及更普遍的,在网络之上建立 Web 服务等。
显然,这些任务在其他语言中早已能够解决,但 Node.js 在处理这些问题时比其他语言简单——因为 Node.js 将并发隐藏在了底层,而对于程序员来说仿佛整个系统就是顺序执行的一样(访问数据不用加锁了,谢天谢地;回调可以直接写成匿名函数了,哦,还能利用闭包,太棒了……)。而且在简单性同时还能保证性能不错。简直是便宜实惠量又足。
但是后来随着业务系统的膨胀,Node.js 的一些问题开始困扰我们。一个突出的问题在于,尽管相对来说 Node.js 的可伸缩性已经很不错,但是由于 JavaScript 语言本身设计的缺陷,其在横向扩展上的语义表达能力依然如同所有 C 家族语言一样贫乏无力。
这使得我们必须借助一些库,来将分散的并发部件委婉的进行建模。并花费大量的精力解决其中的各种阻抗和不匹配。这当然能够做到,但是需要花费的精力实在太多。于是寻找一门能够在并发问题上拥有良好语义的语言就成为了一个自然而然的选择。
为此,我考察了 Scala、Clojure、Go、Rust 等新兴语言,它们都拥有不错的并发模型,但最终给我带来深刻印象的还是 Erlang——
与大多数语言只是把并发作为一个可选的关注点不同,Erlang 是完全围绕并发为核心建立的。这一根本性的理念差异将 Erlang 和其他语言明确的区分开来。深刻的影响了其建模方法,构建理念,以及开发流程。
更重要的是,和一些玩具语言不同,Erlang 经过了强力的实践验证,是工业品质级的语言。拥有自己相对完善和健全的 OTP 平台。而且相关的调试、性能诊断工具都比较健全(很重要)。
在这些方面来看,Node.js 几乎丧失了所有可夸耀的技术性成分。
但如果真要和 Node.js 对比,恐怕相同的任务用 Erlang 完成还会要更简单一些——Erlang 中的比特位语法和位串速构让结构化数据的抽取和构造变得手到擒来,变量与模式匹配能够让一堆的判断和赋值浓缩成简洁的一行代码,这些都是让许多程序员泪流满面的东西。而监强大的容错/局部重启,以及热更新能力,更是产品级软件关注的重点。
所以在技术层面,Node.js 真的很难找到什么亮点去和 Erlang 对抗。