我正在实现一个作业处理时间很长的客户机-服务器API(在某些情况下需要几分钟)。有些api调用很短,可以立即响应,但有些api调用需要一些后端处理。我使用node.js作为web服务器。我目前的实现如下-
客户端(浏览器)<-> node js <-> engine
引擎是处理每个作业(c++代码)的后端进程。所有的交互都是http。现在,传统上我会将长作业实现为异步ajax/restful请求,将短作业实现为同步restful请求。
我将对长处理作业(处理大数据)进行状态更新-如中间结果,完成百分比等。
我正在寻找WebSockets作为一个替代方案(我是相对较新的)。这是我的问题-
- 我应该看看websockets的长作业,而不是异步restful api(我想避免处理客户端超时,长轮询等)?
- 如何将所有的请求移动到websockets(为什么要打扰休息?) 一般来说,实现此体系结构的任何最佳实践。(在此之前,我从事的项目与web服务器和引擎之间的交互作为一个简单的TCP连接与自定义命令。)
注意:-我现在不担心跨浏览器支持(特别是旧版本)。
我已经实现了一个客户端-服务器API,使用websockets在浏览器和c++后端之间进行通信。我们使用的库是libwebsockets http://git.warmcat.com/cgi-bin/cgit/libwebsockets/
长时间运行和同时运行的命令都在websockets上工作得很好。可以从客户端发送多个请求,服务器可以在准备好时响应,并且可以按顺序发送响应(或将响应合并为单个响应)。
超时&Ajax所需的长轮询变得更简单,例如,当套接字断开时,服务器可以检测到客户端断开。
至于最佳实践,我的设计基于这些文章。我们使用JSON对消息进行编码。
- http://www.altdevblogaday.com/2012/02/01/controlling-your-game-engine-over-websocket/
- http://www.altdevblogaday.com/2012/01/23/writing-your-own-websocket-server/
如果你的服务器是node.js,你可以查看Socket.io。这抽象了通信层,并可以根据可用的内容在ajax, websockets等之间进行选择。