Mar*_*eon 11 architecture html5 websocket
要使用Web套接字实现支持客户端的服务器,服务器是否与每个客户端保持开放的HTTP连接?这个规模怎么样?
实现这种类型的服务器时有哪些"编程模型"?即:大多数Web应用程序都有servlet等,它们支持connect-> request-> response-> close type model.而对于网络套接字,连接将无限期保持打开状态.
Bri*_*ell 17
您通常需要在异步模型中工作才能使这些长期连接起作用.进行异步I/O有几种不同的技术; 所有这些都有其优点和缺点.
任何使用过JavaScript和AJAX的人都应该熟悉的是回调模型; 在其中发送请求,并在完成时安装要调用的回调.这是XMLHTTPRequest有效的方式,在等待一个页面的请求完成时不阻塞所有其他页面.这也是Twisted Python网络框架的工作原理,尽管它可以根据您使用的接口调用对象或回调函数上的方法.
另一个强大的模型是Erlang样式方法,称为Actor模型,有许多很多轻量级进程(如线程,但没有共享状态),每个进程都通过异步消息相互通信.Erlang运行时已经实现,可以非常高效地生成数千个进程; 然后,您可以为每个连接创建一个进程,并让它们向实现应用程序后端的其他进程发送消息.Erlang进程也可以在多个OS线程上自动调度,以充分利用多核系统.ejabberd是一个流行的Jabber服务器(聊天协议,需要许多长期开放的连接),在Erlang中实现,Facebook Chat系统也是如此.
来自Google 的新Go语言采用了类似的方法,更接近Hoare的Communicating Sequential而不是Erlang的Actor模型,但它有很多相似之处.
在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方法),请参阅C10K问题,这是一项有助于同时处理10,000个同时连接的不同技术的调查.它还有一个很好的C和C++库列表,用于抽象可用的各种API,例如libevent.
当然,最后一个选择是为每个连接使用一个进程或一个OS线程.问题是,工艺的重量非常大,与许多这些选项相比,甚至螺纹也相当重.通常,为了获得最佳性能,您可能希望每个CPU有一个进程或线程,每个进程或线程使用异步I/O API来确定何时需要执行工作,然后将该工作分派给多个对象或回调之一已经注册处理连接,或等待消息的几个Erlang样式轻量级进程之一,或类似的东西.
作为旁注,Web套接字中的连接不是HTTP连接,而是新协议,即websocket协议,尽管您可以使用与HTTP相同的端口,并将HTTP连接升级到Web套接字以便与现有的兼容防火墙规则.