我正在学习Erlang并试图理解它的套接字是如何工作的,因为它本来是语言和OTP中最强大的部分之一。
我有使用NodeJS的经验,并且想知道使用NodeJS和Erlang创建的应用程序在如何管理多个套接字连接方面有所不同。
据我所知,虽然JavaScript是单线程的,但V8管理它的所有多个同时连接,尽管Erlang本身可以管理多个连接。
所以,我想知道,如果Erlang对一次管理多个连接有很好的支持,那么它与程序员的其他技术有何不同?我的意思是,当我为NodeJS编写一个应用程序时,它可以打开多个连接并且管理良好就像我在Erlang中编写代码一样,不是吗?
请分享您的想法,也欢迎链接到一些关于Erlang特色的文章。
答案 0 :(得分:1)
我绝不是Erlang的专家,但我认为我知道Erlang和NodeJ在同一级别。
你说的话都是正确的。 Bot可以非常高效地处理多个连接,你说管理良好。
但问题是,问题不仅仅是处理多个并发连接。 Erlang试图解决的问题是安全性和分发失败。我不认为NodeJ会像现在这样擅长它。
不要误解,我不是说没有人可以在NodeJs中编写分布式应用程序代码,但考虑到Erlang为您提供的工具,它可能是更好的选择。
对于失败安全性,作为一个例子,Erlang让你链接你的进程,所以当一个失败时,其他也失败或得到通知。这本身并不是很实用,但当你与supervisors和无共享流程一起看时,它是一个很棒的工具。
为了分发,Erlang让你将节点链接在一起。链接节点可以像在同一台机器上一样通话,也可以在另一侧生成进程。考虑这一点,能够从另一个健康的节点上的故障节点启动失败的应用程序。为您提供良好的正常运行时间。
更不用说这些工具背后有多年的经验。
尝试在另一个生态系统上解决这些问题。我说生态系统,因为Erlang作为一种语言并不完整,但是必须考虑工具和框架(主要是OTP)。那么你也可以说Erlang在这方面真的很棒。
但是Erlang在线性处理,数字处理,图像/声音处理等方面也不是很好。在其他系统中可以更好地实现。
我认为,在这方面,NodeJs和Erlang之间的最大区别在于它们的运行时模型。 NodeJ有一个进程,一个在io相关任务上工作异步的线程。当然,您可以运行多个进程,但这是基本的事情。另一方面,Erlang有一个名为BEAM的VM。 Erlang在这个VM中使用了特殊的进程,非常轻的进程。 BEAM自己安排它们,因为它们不是OS进程。这为BEAM提供了优势,可以同时拥有数十万个进程,每个进程都可以执行任务,无论是io还是其他任何进程。
我认为你现在看到了不同之处。当故障安全或分配是必须的时候,Erlang更受战斗考验,更好。当您需要更快的开发和部署时,NodeJ可能会更好。