architecture - Web 套接字服务器端处理模型

标签 architecture html websocket

使用 web sockets 实现支持客户端的服务器,服务器是否与每个客户端保持开放的 HTTP 连接?这怎么能规模?

实现此类服务器时的“编程模型”是什么?即:大多数 Web 应用程序都有 servlet 等,它们支持连接->请求->响应->关闭类型模型。而对于网络套接字,连接会无限期地保持打开状态。

最佳答案

您通常需要在 asynchronous 工作这些长期连接工作的模型。有几种不同的异步 I/O 技术;所有这些都有其优点和缺点。

任何使用过 JavaScript 和 AJAX 的人都应该已经熟悉了。是回调模型;您在其中发送请求,并安装一个回调以在完成时调用。就是这样XMLHTTPRequest工作,而不会在等待页面请求完成时阻止所有其他页面。 Twisted也是这样的Python 网络框架可以工作,但它可以根据您使用的接口(interface)调用对象上的方法或回调函数。

另一个强大的模型是 Erlang样式方法,称为 Actor 模型,有许多轻量级进程(如线程,但没有共享状态),每个进程通过异步消息相互通信。 Erlang 运行时已经实现,可以非常高效地生成数千个进程;那么您可以为每个连接设置一个进程,并让它们向实现应用程序后端的其他进程发送消息。 Erlang 进程也可以自动调度到多个 OS 线程上,以充分利用多核系统。 ejabberd ,一种流行的 Jabber 服务器(一种聊天协议(protocol),需要许多长期开放的连接),是在 Erlang 中实现的,就像 Facebook Chat system 一样。 .

新款Go language来自 Google 使用了类似的方法,比 Erlang 的 Actor 模型更接近于 Hoare 的 Communicating Sequential,但有很多相似之处。

在 Mac OS X 10.6 中,Apple 引入了 Grand Central Dispatch ,以及 C、C++ 和 Objective-C 中的块(本质上是闭包)。这允许类似于 AJAX 或 Twisted 样式事件驱动的回调模型,但具有显式管理的队列,这些队列按顺序执行以管理对多线程、多核环境中共享资源的访问。 Twisted 和 JavaScript 都运行单线程,因此只能利用单核,除非您使用多个操作系统进程,这可能会相当沉重并增加它们之间的通信成本。

然后是更传统的模型,如 Unix select 功能,或更现代和功能强大的 epoll kqueue() .在这些中,您的程序中通常有一个主循环,它设置了一堆要监视的事件(网络 I/O 返回更多数据,文件 I/O 返回更多数据,建立新的网络连接等) ,然后调用一个系统调用,在这些事件之一发生之前​​阻塞,此时您检查发生了哪个事件,然后适本地处理它。这些系统调用通常用于提供上述更高级别的框架。

有关可用选项的惊人数组的非常好的概述(专注于更传统和更低级别的 Unix 方法),请参阅 The C10K Problem ,对有助于同时处理 10,000 个同时连接的不同技术的调查。这也有一个很好的 C 和 C++ 库列表,用于抽象各种可用的 API,例如 libevent .

当然,最后一种选择是为每个连接使用一个进程或一个操作系统线程。问题是,进程的权重非常大,与许多这些选项相比,甚至线程的权重也相当大。通常,为了获得最佳性能,您希望每个 CPU 有一个进程或线程,每个进程或线程都使用异步 I/O API 来确定何时需要执行工作,然后将该工作分派(dispatch)给多个对象或回调之一已经注册来处理连接的,或者等待消息的几个 Erlang 风格的轻量级进程之一,或者类似的东西。

附带说明一下,Web 套接字中的连接不是 HTTP 连接,而是一种新协议(protocol),websocket protocol ,尽管您可以使用与 HTTP 相同的端口,并将 HTTP 连接升级到 Web 套接字以与现有防火墙规则兼容。

关于architecture - Web 套接字服务器端处理模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1996928/

相关文章:

ios - 如果在 Swift 中使用 Router 和 MVVM,谁负责配置演示文稿的具体细节?

heroku - Redis 可以帮助规避数据库连接限制吗

architecture - 需要帮助了解基本的计算机体系结构

html - Tahoma 文字看起来不流畅

tomcat - Apache Tomcat websockets 服务器端消息

javascript - 如何使用动态 data-websockets 运行 AngularJS 服务

azure - 使用 Azure AD Auth 和 Web 应用程序 API 进行 Multi-Tenancy

html - GWT - setProperty 方法对 FireFox 浏览器没有影响

php - 根据 PHP 变量设置表单下拉列表

security - WebSockets身份验证