我在Node.js中为多用户人工智能应用构建了多个套接字服务器应用程序。我们正在考虑每盒1K到10K有效插座连接。然而,即使在空闲和0活动连接时,我的一些服务器在Unix上运行时消耗50-100 MB的内存。我确信使用像C#或C ++这样的合理平台,这应该接近0 MB。因此,我们正在考虑一个更好的港口和#34;平台。现在让我澄清一下我的用例:
我们选择了节点因为它是Unix友好的(与.NET不同)并且看起来很容易使用。但是由于目前的内存消耗,我们需要评估其他选项。许多人比较Node.js with 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 ++的任何其他意见?
Bounty:我需要C#和/或C ++中的建议和推荐的套接字服务器库/实现/示例应用程序。必须是开源的。我需要它是高性能,异步和无错误。必须支持二进制数据传输。必须在Windows上运行。 Unix是一个奖励。
答案 0 :(得分:7)
我们正在考虑每盒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中的异步IO(又名Java.NIO),C#(async / await)和C ++(像epoll / IOCompletionPort这样的本地东西,或者像Boost.ASIO / CPP-rest,Proxygen等更高级的东西)
我们选择了节点,因为它是Unix友好的(与.NET不同)
我将不得不为C ++找到一个类似的套接字框架。
Boost.ASIO,或自己写点东西,真的不那么难......
所以把这些放在一起,使用.NET或者有什么好处 C ++ over Node.js?
更好的CPU使用率:因为C ++和C#是强类型语言,而C ++是一种静态编译语言,所以编译器有很大的优势可以优化CPU的大量工作。
降低内存占用率:通常因为强类型语言具有较小的对象而没有在场景后面保留大量元数据的开销。 使用C ++,具有堆栈分配和作用域对象的生命周期通常内存占用率很低。再次,它取决于任何语言的代码质量。
没有回调地狱:C#有任务和异步等待。 C ++有期货/承诺,一些编译器(又名VC ++)确实支持等待。异步代码变得非常有趣,因为它与回调相反。是的,我确实知道JS的承诺和新的async / await东西,但与.Net实现相比,它们相对较新。
编译器检查:由于必须编译C#和C ++,因此在编译时会遇到很多愚蠢的错误。 no" undefiend不是一个功能"或"无法读取未定义的属性"。
除此之外,它几乎是一个选择问题。
答案 1 :(得分:2)
NetMQ是zeromq的本地C#端口。
Zeromq是轻量级消息传递库,如果你想了解消息传递,zeromq指南是一个很棒的指南,它也可以作为一本书出现。它适用于zeromq和NetMQ。
如果您正在使用Windows并且需要处理大量连接,我不建议使用zeromq,因为它不使用IOCP。
NetMQ在Windows上使用IOCP,在Windows和Linux上都可以使用。
披露 - 我是zeromq(libzmq)项目的NetMQ和维护者的作者。
[1] https://github.com/zeromq/netmq
[2] http://netmq.readthedocs.io/en/latest/
答案 2 :(得分:1)
我们进行了大量的CPU密集型数据处理
Node.js从一开始就可能是错误的选择,它可能永远不会匹配C ++服务器的性能。但是,如果你做得对,它可能非常接近。此外,编写好的C ++并完全重写系统既困难又耗时。所以,我想给出一些理由让你坚持使用Node.js,或者至少在移动之前完全用尽所有选项。
我的服务器消耗50-100 MB
您使用的是Node.js v0.12吗?使用Node.js v4.2 LTS,空闲Node.js服务器应该使用大约20 MB的内存。 (由于V8,它可能永远不会接近0 MB)你检查过内存泄漏吗?
每盒1K至10K有效插座连接
这应该很容易实现。如果您使用的是最受欢迎的socket.io
库,请参阅以下相关基准。
在使用一个内核的3.3 GHz Xeon X5470上,每秒最大消息发送速率约为9,000-10,000,具体取决于并发级别。
来自:http://drewww.github.io/socket.io-benchmarking/ (因为,所有这些连接同时保持活动,CPU使用更重要)
如果您已经在使用该问题并遇到问题,请尝试将socket.io
替换为SocketCluster
,这样可以更快,更具可扩展性。替换它应该比完全重写更容易。这是一些基准:
运行Linux的8核Amazon EC2 m3.2xlarge实例
在42K时,最忙碌的工作人员的CPU使用率降至45%左右
http://socketcluster.io/#!/performance
最后,证明Node.js几乎可以达到C ++性能。看看这个:
服务器使用12G内存
它支持1,200,000个有效的websocket连接
https://github.com/smallnest/C1000K-Servers
我的观点是,您可以轻松地使用Node.js达到平均性能目标。尝试进行基准测试(https://github.com/machinezone/tcpkali)并找到问题而不是完全重写。