用 Erlang 与其他人制作的套接字服务器

Posted

技术标签:

【中文标题】用 Erlang 与其他人制作的套接字服务器【英文标题】:Sockets server made with Erlang vs others 【发布时间】:2016-12-05 11:51:16 【问题描述】:

我正在学习 Erlang,并试图了解它的套接字是如何工作的,因为它是该语言和 OTP 中最强大的部分之一。

我有使用 NodeJS 的经验,想知道使用 NodeJS 和 Erlang 制作的应用程序在管理多个套接字连接方面有何不同。

据我了解,虽然 javascript 是单线程的,但 V8 为其管理所有多个同时连接,尽管 Erlang 可以自己管理多个连接。

所以,我想知道,如果 Erlang 对一次管理多个连接有出色的支持,那么对于程序员来说,它与其他技术有什么不同呢?我的意思是,当我为 NodeJS 编写应用程序时,它可以打开和管理尽可能多的连接,就像我在 Erlang 中编写代码一样,不是吗?

请分享您的想法,也欢迎提供一些关于 Erlang 在这种情况下的特色的文章的链接。

【问题讨论】:

【参考方案1】:

我绝不是 Erlang 方面的专家,但我认为我对 Erlang 和 NodeJs 的了解处于同一水平。

你说的都是对的。 Bot 可以非常有效地处理多个连接,你说的管理得很好。

但问题是,问题不仅在于处理多个并发连接。 Erlang 试图很好地解决的问题是故障安全和分布。我认为 NodeJ 不会像现在这样擅长它。

不要误会,我并不是说没有人可以在 NodeJs 中编写分布式应用程序,但考虑到 Erlang 提供的工具,它可能是一个更好的选择。

对于故障安全,例如,Erlang 让您链接您的进程,因此当一个失败时,另一个也失败或收到通知。这本身并不是很实用,但是当您将它与 supervisors 和无共享进程一起查看时,它是一个很棒的工具。

对于分发,Erlang 让您将节点链接在一起。链接的节点可以像在同一台机器上一样一起交谈,并且它们也可以在另一端产生进程。考虑一下这一点,能够从另一个健康节点上的故障节点启动故障应用程序。为您提供良好的正常运行时间。

更不用说这些工具背后有多年的经验。

尝试在另一个生态系统中解决这些问题。我说生态系统,因为 Erlang 作为一门语言并不完整,但工具和框架(主要是 OTP)也必须考虑。那么你也可以说Erlang在这方面真的是大放异彩了。

但是 Erlang 在线性处理、数字运算、图像/声音处理等方面也不是很好。在另一个系统中实现会更好。

我认为,在这方面,NodeJs 和 Erlang 之间的最大区别在于它们的运行时模型。 NodeJs 有一个进程,一个线程在与 io 相关的任务上异步工作。当然,您可以运行多个进程,但这是基本的事情。另一方面,Erlang 有一个名为 BEAM 的 VM。 Erlang 在这个 VM 中使用了特殊的进程,非常轻量级的进程。 BEAM 自己安排它们,因为它们不是操作系统进程。这使 BEAM 具有同时拥有数十万个进程的优势,每个进程都执行一项任务,无论是 io 还是其他任何任务。

我想你现在看到了不同之处。 Erlang 更久经考验,在故障安全或分发是必须的情况下更好。当您需要更快的开发和部署时,NodeJs 可能会更好。

【讨论】:

以上是关于用 Erlang 与其他人制作的套接字服务器的主要内容,如果未能解决你的问题,请参考以下文章

Erlang:连接到服务器,并在同一个套接字上接收输入

为啥我的 .NET Web 服务 XML 与其他人的不同?

Java erlang 套接字通信

使用 XMPP 关闭 GCM 连接服务器的套接字

erlang 发送套接字西里尔文数据

Erlang & Yaws 安装