Rob*_*cks 5 c# c++ sockets node.js
我在Node.js中为多用户人工智能应用程序构建了多个套接字服务器应用程序.我们正在考虑每盒1K到10K有源插座连接.然而,即使在空闲和0活动连接时,我的一些服务器在Unix上运行时消耗50-100 MB的内存.我确信使用像C#或C++这样合理的平台,这应该接近0 MB.所以我们正在考虑将端口变为"更好"的平台.现在让我澄清一下我的用例:
我们选择节点,因为它是Unix友好的(不像.NET),似乎很容易使用.但是由于目前的内存消耗,我们需要评估其他选项.许多人将Node.js与ASP.NET进行了比较,但我需要用C#或C++构建套接字服务器.
我在.NET和C++方面有丰富的经验.像SuperSocket(由Redgate和Telerik使用)这样的库可以处理.NET中的所有低级内容.我将不得不为C++找到一个类似的套接字框架.
总而言之,使用.NET或C++而不是Node.js有什么好处?考虑到我的服务器是高度CPU限制的(不受I/O约束)使用.NET/C++的好处是显着的还是我应该坚持使用Node.js?关于将Node.js应用程序移植到C#或C++的任何其他评论?
赏金:我需要C#和/或C++中的建议和推荐的套接字服务器库/实现/示例应用程序.必须是开源的.我需要它是高性能,异步和无错误.必须支持二进制数据传输.必须在Windows上运行.Unix是一个奖励.
我们正在考虑每盒1K到10K有源插座连接
这里的瓶颈不是编程语言或技术,而是硬件和操作系统支持.限制并发套接字数量的事情基本上就是你正在运行的机器.然而,根据我的经验,C++的确定对象生存期可以极大地帮助支持大量并发OS资源.
这不是"网络服务器".没有提供文件.
我在专业工作中做了一些Node.js,我做了一些C#,但主要是C++.即使将node.js作为Web服务器,除了语言本身之外,大多数客户端和服务器代码没有太多共同之处.Web服务器主要处理商务逻辑,而客户端处理提取和呈现数据的交互.因此,我认为node.js作为Web服务器的主要优点在于它为纯粹的JS开发人员提供了编写服务器端的能力,而无需使用他们不熟悉的语言/技术.
我们进行了大量CPU密集型数据处理,某些部分已经移植到C++并通过本机模块拉入节点.
是的.使用强类型语言可以在这里创造奇迹.没有redunadand运行时解析.
我们不需要访问很多I/O(在大多数情况下访问一些文件,在某些情况下没有,我们也不使用RDBMS)
嗯,我觉得有一个神话,node.js以某种方式比其他技术更好地处理IO.这完全是错的.Node.js的主要特性是默认情况下IO是异步的.但Node.js没有发明任何轮子.你有Java(又名Java.NIO),C#(异步/等待)和C++的异步IO(像epoll/IOCompletionPort这样的本地东西,或者像Boost.ASIO/CPP-rest,Proxygen等更高级的东西)
我们选择了节点因为它是Unix友好的(不像.NET)
.Net Core是一种相对较新的技术,其中.Net可以在基于Unix的系统上运行(如linux)
我将不得不为C++找到一个类似的套接字框架.
Boost.ASIO,或自己写点东西,真的不是那么难......
总而言之,使用.NET或C++而不是Node.js有什么好处?
更好的CPU使用率:因为C++和C#是强类型语言,而C++是一种静态编译语言,所以编译器有很大的优势可以优化CPU广泛的工作.
较低的内存占用:通常是因为强类型语言具有较小的对象而没有在场景后面保留大量元数据的开销.使用C++,具有堆栈分配和作用域对象的生命周期通常内存占用率很低.再次,它取决于任何语言的代码质量.
没有回调地狱:C#有任务和异步等待.C++有期货/承诺,一些编译器(又名VC++)确实支持等待.异步代码变得非常有趣,因为它与回调相反.是的,我确实知道JS承诺和新的async/await东西,但与.Net实现相比,它们相对较新.
编译器检查:由于必须编译C#和C++,因此在编译时会遇到很多愚蠢的错误.没有"undefiend不是函数"或"不能读取未定义的属性".
除此之外,它几乎是一个选择问题.