c# - 将套接字服务器从 Node.js 移植到 C#

标签 c# c++ node.js sockets

我在 Node.js 中为多用户人工智能应用程序构建了多个套接字服务器应用程序。我们希望每个盒子有 1K 到 10K 个事件套接字连接。然而,即使在闲置且有 0 个事件连接时,我的一些服务器在 Unix 上运行时也会消耗 50-100 MB 的内存。我确信对于像 C# 或 C++ 这样的合理平台,这应该接近 0 MB。所以我们正在考虑移植到“更好”的平台。现在让我澄清一下我的用例:

  • 这不是“网络服务器”。没有提供任何文件。
  • 我们进行了大量 CPU 密集型数据处理,某些部分已经移植到 C++ 并通过 native 模块拉入 Node 。
  • 我们不需要访问太多的 I/O(在大多数情况下访问几个文件,在某些情况下没有,我们也不使用 RDBMS)

我们选择了 node,因为它对 Unix 友好(与 .NET 不同)并且看起来易于使用。但鉴于其当前的内存消耗,我们需要评估其他选项。很多人比较过Node.js with ASP.NET但我需要用 C# 或 C++ 构建套接字服务器。

我在 .NET 和 C++ 方面拥有丰富的经验。有类似 SuperSocket 的库(由 Redgate 和 Telerik 使用)处理 .NET 中的所有低级内容。我将不得不为 C++ 找到一个类似的套接字框架。

综上所述,与 Node.js 相比,使用 .NET 或 C++ 有哪些优势?考虑到我的服务器高度受 CPU 限制(而非 I/O 限制),使用 .NET/C++ 的好处是否显着,还是我应该坚持使用 Node.js?关于将 Node.js 应用程序移植到 C# 或 C++ 的任何其他意见?

赏金:我需要建议和推荐的 C# 和/或 C++ 套接字服务器库/实现/示例应用程序。必须是开源的。我需要它是高性能、异步和无错误的。必须支持二进制数据传输。必须在 Windows 上运行。 Unix 是一个奖励。

最佳答案

We're looking at 1K to 10K active socket connections per box

这里的瓶颈不是编程语言或技术,而是硬件和操作系统支持。限制并发套接字数量的基本上是你运行的机器。然而,根据我的经验,C++ 的确定性对象生命周期可以极大地帮助支持大量并发操作系统资源。

This is not a "web server". No files are served.

我在我的专业工作中做过一些 Node.js,我做过一些 C#,但主要是 C++。即使使用 node.js 作为 Web 服务器,除了语言本身之外,大多数客户端和服务器代码也没有太多共同点。 Web 服务器主要处理业务逻辑,而客户端处理交互地获取和呈现数据。因此,我认为 node.js 作为 Web 服务器的主要优势在于,它使纯粹的 JS 开发人员能够在不使用他们不熟悉的语言/技术的情况下编写服务器端。

We do lots of CPU intensive data processing and certain portions have already been ported to C++ and pulled into node via native modules.

是的。使用强类型语言可以在这里创造奇迹。没有冗余和运行时解析。

We don't need to access much I/O (in most cases a few files are accessed, in some cases none, we don't use an RDBMS either)

好吧,我觉得空气中有一个神话,即 node.js 以某种方式比其他技术更好地处理 IO。这是完全错误的。 Node.js 的主要特点是默认情况下,IO 是异步的。但是 Node.js 并没有发明任何轮子。你在 Java(又名 Java.NIO)、C#(async/await)和 C++ 中有异步 IO(像 epoll/IOCompletionPort 这样的原生东西,或者像 Boost.ASIO/CPP-rest、Proxygen 等更高级的东西)

We went with node because it was Unix friendly (unlike .NET)

.Net Core 是一项相对较新的技术,.Net 可以在基于 Unix 的系统(如 linux)上运行

I will have to find a similar socket framework for C++.

Boost.ASIO,或者自己写点东西,真的没那么难..

So putting this all together, what are the advantages of using .NET or C++ over Node.js?

更好的 CPU 使用率:因为 C++ 和 C# 是强类型语言,而 C++ 是静态编译语言,编译器有很大的机会优化 CPU 密集型工作。

较低的内存占用:通常是因为强类型语言具有较小的对象,而无需在幕后保留大量元数据的开销。 使用 C++,具有堆栈分配和作用域对象生命周期通常内存占用量很低。同样,这取决于任何语言的代码质量。

没有回调 hell :C# 有任务和异步等待。 C++ 有 futures/promises,一些编译器(又名 VC++)也支持 await。与回调相反,异步代码编写起来变得纯粹有趣。是的,我知道 JS promises 和新的 async/await 东西,但与 .Net 实现相比,它们相对较新。

编译器检查:由于必须编译 C# 和 C++,因此在编译时会发现很多愚蠢的错误。没有“undefiend 不是函数”或“无法读取未定义的属性”。

除此之外,这几乎是一个选择问题。

关于c# - 将套接字服务器从 Node.js 移植到 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36688180/

相关文章:

node.js - 尝试使用 docker 执行 apt-get,导致错误 100

c# - 在 String.Format 中转义大括号 '{'

java - CORBA 测试自动化

c++ - malloc: *** 对象错误:未分配被释放的指针 *** 在 malloc_error_break 中设置断点以进行调试

c++ - 访问指针数组中的子类方法

Node.js 应用程序从本地主机到网络

javascript - 如何使用 Lodash 从数组中删除对象?

c# - 如何使用 Windows Phone 8 中的属性在 SQLite 中创建多个表

c# - EPPlus 是否需要在服务器上安装 Excel?

c# - 部署为 Windows 服务时,不会读取 asp.net Core 2 Web API appsetting.json 值