简而言之:
您应该能够实现数百万的数量级同时活动的 TCP 连接和扩展的 HTTP 请求。这告诉您使用正确的平台和正确的配置可以获得的最大性能。
今天,我担心带有 ASP.NET 的 IIS 是否支持 100 个并发连接(查看我的更新,预计在较旧的 ASP.Net Mono 版本上每秒大约有 10k 响应)。当我看到这个问题/答案时,我忍不住回答自己,这里问题的许多答案都是完全错误的。
最佳案例
这个问题的答案必须只涉及最简单的服务器配置,以与下游可能的无数变量和配置解耦。
因此,请考虑以下场景作为我的答案:
- TCP 会话上没有流量,除了保持活动的数据包(否则您显然需要相应数量的网络带宽和其他计算机资源)
- 软件设计为使用异步套接字和编程,而不是池中每个请求的硬件线程。 (即 IIS、Node.js、Nginx...带有异步设计的应用程序软件的网络服务器 [但不是 Apache])
- 良好的性能/美元CPU/内存。今天,随意假设 i7(4 核)和 8GB RAM。
- 一个好的防火墙/路由器相匹配。
- 没有虚拟限制/调节器 - 即。 Linux somaxconn、IIS web.config...
- 不依赖其他较慢的硬件 - 不从硬盘读取,因为它将是最低的共同点和瓶颈,而不是网络 IO。
详细解答
相对于异步 IO 实现,同步线程绑定设计往往性能最差。
WhatsApp 可以在一台 Unix 风格的操作系统机器上处理百万流量 -https://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/ https://web.archive.org/web/20120108184257/https://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/.
最后,这个,http://highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html http://highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html,深入探讨了如何实现 1000 万的大量细节。服务器通常具有硬件 TCP 卸载引擎,专门为此特定角色设计的 ASIC 比通用 CPU 更高效。
良好的软件设计选择
异步 IO 设计因操作系统和编程平台而异。 Node.js 的设计是异步心里。你至少应该使用 Promises,当 ECMAScript 7 出现时,async
/await
。 C#/.Net 已经像 Node.js 一样提供了完整的异步支持。无论什么操作系统和平台,异步都应该表现得很好。无论您选择哪种语言,请查找关键字“异步”,大多数现代语言都会提供一些支持,即使它是某种附加组件。
去网络农场?
无论您的特定情况有什么限制,网络农场都是一种很好的扩展解决方案。有许多架构可以实现这一点。一种是使用负载平衡器(托管提供商可以提供这些,但即使这些也有限制,以及带宽上限),但我不喜欢这个选项。对于具有长时间运行连接的单页应用程序,我更喜欢拥有一个开放的服务器列表,客户端应用程序将在启动时随机选择这些服务器,并在应用程序的生命周期内重复使用。这消除了单点故障(负载均衡器),并支持通过多个数据中心进行扩展,从而获得更多带宽。
打破神话 - 64K 端口
对于有关“64,000”的问题部分,这是一个误解。一台服务器可以连接超过 65535 个客户端。看https://networkengineering.stackexchange.com/questions/48283/is-a-tcp-server-limited-to-65535-clients/48284 https://networkengineering.stackexchange.com/questions/48283/is-a-tcp-server-limited-to-65535-clients/48284
顺便说一句,Windows 上的 Http.sys 允许多个应用程序在 HTTP URL 架构下共享同一服务器端口。它们各自注册一个单独的域绑定,但最终有一个服务器应用程序将请求代理到正确的应用程序。
更新2019-05-30
以下是最快的 HTTP 库的最新比较 -
- 测试日期:2018-06-06
- 使用的硬件:Dell R440 Xeon Gold + 10 GbE
- 领导者每秒有大约 700 万个纯文本响应(响应而不是连接)
- 第二个 Fasthttp for golang 通告 1.5M 并发连接 - 请参阅https://github.com/valyala/fasthttp https://github.com/valyala/fasthttp
- 领先的语言是 Rust、Go、C++、Java、C,甚至 C# 排名第 11 位(每秒 6.9M)。 Scala 和 Clojure 排名更靠后。 Python 以每秒 270 万的速度排名第 29 位。
- 在列表的底部,我注意到 laravel 和 cakephp、rails、aspnet-mono-ngx、symfony、zend。均低于每秒 10k。请注意,大多数这些框架都是为动态页面构建的,并且相当古老,可能有较新的变体在列表中排名靠前。
- 请记住,这是 HTTP 明文,不适用于 Websocket 专业:许多人来到这里可能会对 Websocket 的并发连接感兴趣。