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

Architecture Web套接字服务器端处理模型,architecture,html,websocket,Architecture,Html,Websocket,要使用实现支持客户端的服务器,服务器是否与每个客户端保持开放的HTTP连接?这种规模如何 在实现这种类型的服务器时,“编程模型”是什么?Ie:大多数web应用程序都有servlet等,它们支持连接->请求->响应->关闭类型模型。而对于web套接字,连接将无限期地保持打开状态 一般来说,您应该期望将WebSocket与定制服务器实现结合使用,以轻量级方式处理负载。这样的服务器已经存在,用于长时间的COMET连接等。它与http的不同之处在于,每个后续请求/响应不需要包装在带有http头的http

要使用实现支持客户端的服务器,服务器是否与每个客户端保持开放的HTTP连接?这种规模如何


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

一般来说,您应该期望将WebSocket与定制服务器实现结合使用,以轻量级方式处理负载。这样的服务器已经存在,用于长时间的COMET连接等。

它与http的不同之处在于,每个后续请求/响应不需要包装在带有http头的http消息中。因此,实时应用程序不需要解析头的开销。在最初的类似http的握手之后,它的行为基本上类似于常规的ol'tcp套接字


这可以用servlet进行建模,但只需区分初始请求(包含所有头)和随后的双向对话框,后者的格式在很大程度上是任意的。

通常需要在模型中工作,才能使这些长期存在的连接正常工作。有几种不同的异步I/O技术;所有这些都有其优缺点

使用过JavaScript的人应该已经熟悉的回调模型;在其中,您发送一个请求,并安装一个回调函数,当它完成时被调用。这就是
XMLHTTPRequest
的工作方式,在等待一个页面请求完成时,不会阻塞所有其他页面。这也是Python网络框架的工作方式,尽管它可以根据您使用的接口调用对象上的方法或回调函数

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

来自谷歌的新模型使用了类似的方法,比Erlang的演员模型更接近Hoare的沟通顺序,但有很多相似之处

在Mac OS X 10.6中,苹果引入了C、C++和Objtovi.C中的块(基本上是闭包),这允许类似Ajax或扭曲风格的事件驱动回调模型,但是可以用顺序管理的显式管理队列来管理对多线程、多核环境中共享资源的访问。Twisted和JavaScript都运行单线程,因此只能利用单个内核,除非您使用多个操作系统进程,这可能会相当沉重,并增加它们之间的通信成本

还有一些更传统的模型,比如Unix函数,或者更现代、功能更强大的模型。在这些情况下,您的程序中通常有一个主循环,它设置一组要监视的事件(网络I/O返回更多数据,文件I/O返回更多数据,建立新的网络连接等),然后调用一个系统调用,该调用将阻塞直到其中一个事件发生,在这一点上,您可以检查发生了哪一种情况,然后进行适当的处理。这些系统调用通常用于提供上述更高级别的框架

有关令人震惊的可用选项列表的非常好的概述(重点是更传统、更低级的Unix方法),请参阅,一项关于帮助同时处理10000个连接的不同技术的调查。这也有一个很好的C和C++库列表,用于对各种API进行抽象,例如.< /P> 当然,最后一个选择是为每个连接使用一个进程或一个OS线程。问题是,进程的重量非常重,与许多选项相比,甚至线程的重量也相当重。一般来说,为了获得最佳性能,您希望每个CPU有一个进程或线程,每个进程或线程都使用异步I/O API来确定何时需要执行工作,然后将该工作分配给已注册以处理连接的多个对象或回调中的一个,或者几个正在等待消息的Erlang风格的轻量级进程中的一个,或者类似的进程


作为旁注,web套接字中的连接不是HTTP连接,而是一种新协议,尽管您可以使用与HTTP相同的端口,并将HTTP连接升级到web套接字,以便与现有防火墙规则兼容。

请查看Tornado webserver中实现的HTML 5 WebSocket:

不过,我还没有玩过这个模块