我在 Node.js 中为多用户人工智能应用程序构建了多个套接字服务器应用程序。我们希望每个盒子有 1K 到 10K 个事件套接字连接。然而,即使在闲置且有 0 个事件连接时,我的一些服务器在 Unix 上运行时也会消耗 50-100 MB 的内存。我确信对于像 C# 或 C++ 这样的合理平台,这应该接近 0 MB。所以我们正在考虑移植到“更好”的平台。现在让我澄清一下我的用例:
我们选择了 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/
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
s=Socket.new(Socket::AF_INET,Socket::SOCK_STREAM,0)s.connect(Socket.pack_sockaddr_in('port','hostname'))ssl=OpenSSL::SSL::SSLSocket.new(s,sslcert)ssl.connect从这里开始,如果ssl连接和底层套接字仍然是ESTABLISHED,或者它是否在默认值7200之后进入CLOSE_WAIT,我想检查一个线程几秒钟甚至更糟的是在实际上不需要.write()或.read()的情况下关闭。是用select()、IO.select()还是其他方法完成
require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame