Ros*_*oss 36 rest polling long-polling
如果有一个REST资源我想要监视来自其他客户端的更改或修改,那么最好的(也是最RESTful)方式是什么?
我这样做的一个想法是提供特定的资源来保持连接打开,而不是在资源不存在的情况下立即返回.例如,给定资源:
/game/17/playerToMove
Run Code Online (Sandbox Code Playgroud)
这个资源上的"GET"可能会告诉我轮到我的对手了.我可能会注意到移动号码(比如5)并试图检索下一步行动,而不是不断地轮询这个资源以找出轮到我移动的时间:
/game/17/move/5
Run Code Online (Sandbox Code Playgroud)
在"正常"REST模型中,似乎对此URL的GET请求将返回404(未找到)错误.但是,如果相反,服务器保持连接打开,直到我的对手发挥他的移动,即:
PUT /game/17/move/5
Run Code Online (Sandbox Code Playgroud)
然后服务器可以将我的对手PUT的内容返回到该资源.这将为我提供我需要的数据,以及一种通知我的对手何时移动而不需要轮询.
这种方案是RESTful吗?或者它违反了某种REST原则?
dbr*_*dbr 25
您提出的解决方案听起来像长轮询,可以很好地工作.
/game/17/move/5在移动5完成之前,您将请求并且服务器不会发送任何数据.如果连接断开,或者您有超时,则只需重新连接,直到获得有效响应.
这样做的好处是它非常快 - 只要服务器有新数据,客户端就会得到它.它也可以恢复连接,并且可以在客户端断开连接一段时间后工作(您可以/game/17/move/5在移动后一小时请求并立即获取数据,然后移动move/6/等等)
长轮询的问题是每次"轮询"都会占用服务器线程,这会迅速破坏像Apache这样的服务器(因为它耗尽了工作线程,因此无法接受其他请求).您需要一个专门的Web服务器来为长轮询请求提供服务.Python模块twisted(一个"事件驱动的网络引擎")非常适合这种情况,但它比常规轮询更有用.
在回答你关于Jetty/Tomcat的评论时,我对Java没有任何经验,但似乎他们都使用类似的工作线程池系统到Apache,所以它会遇到同样的问题.我确实发现这篇文章似乎正好解决了这个问题(对于Tomcat)
| 归档时间: |
|
| 查看次数: |
21835 次 |
| 最近记录: |