首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >监控REST资源更改的RESTful方式是什么?

监控REST资源更改的RESTful方式是什么?
EN

Stack Overflow用户
提问于 2009-01-02 03:26:48
回答 3查看 27.7K关注 0票数 40

如果有一个REST资源,我想监控来自其他客户端的更改或修改,那么最好的(也是最RESTful的)方法是什么?

我的一个想法是,通过提供特定的资源来保持连接打开,而不是在资源(尚未)存在时立即返回。例如,给定资源:

代码语言:javascript
复制
/game/17/playerToMove

在这个资源上的"GET“可能会告诉我轮到我的对手移动了。我可能会记下移动编号(比方说5),然后尝试检索下一次移动,而不是不断地轮询此资源以了解何时轮到我移动:

代码语言:javascript
复制
/game/17/move/5

在“普通”REST模型中,对此URL的GET请求似乎会返回404 (未找到)错误。然而,如果相反,服务器保持连接打开,直到我的对手进行他的移动,即:

代码语言:javascript
复制
PUT /game/17/move/5

然后,服务器可以返回我的对手放入该资源中的内容。这既可以为我提供所需的数据,也可以在不需要轮询的情况下通知我的对手何时移动。

这是一种RESTful计划吗?或者它是否违反了某种REST原则?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-01-02 04:39:45

您提出的解决方案听起来像long polling,它可以很好地工作。

您将请求/game/17/move/5,服务器将不会发送任何数据,直到移动5完成。如果连接中断或超时,您只需重新连接,直到获得有效响应。

这样做的好处是它非常快-一旦服务器有新的数据,客户端就会得到它。它对断开的连接也很有弹性,如果客户端断开一段时间就能工作(你可以在移动一小时后请求/game/17/move/5并立即获取数据,然后转移到move/6/上,依此类推)

长轮询的问题是,每个“轮询”都绑定了一个服务器线程,这会迅速中断Apache等服务器(因为它耗尽了工作线程,所以无法接受其他请求)。您需要一个专门的web服务器来处理长轮询请求。Python模块twisted (一种“事件驱动的网络引擎”)在这方面做得很好,但它比常规轮询要做更多的工作。

在回答您关于Jetty/Tomcat的评论时,我没有任何使用Java的经验,但是它们似乎都使用与Apache类似的工作线程池系统,所以它也会有同样的问题。我确实找到了this post,它似乎正好解决了这个问题(对于Tomcat)

票数 28
EN

Stack Overflow用户

发布于 2009-01-02 03:43:17

我发现this article提出了一个新的HTTP头"When- modified -After",它实际上做了同样的事情--服务器等待并保持连接打开,直到资源被修改。

我更喜欢基于版本的方法,而不是基于时间戳的方法,因为它不太容易出现竞争条件,并为您提供了更多关于正在检索的内容的信息。对这种方法有什么想法吗?

票数 2
EN

Stack Overflow用户

发布于 2009-01-02 03:54:18

如果您的目标客户端是web浏览器,我建议使用404,因为保持连接打开可以主动阻止客户端中对相同域的浏览器请求。轮询频率由客户决定。

2021年编辑:根据上下文,上面的答案是在2009年。

今天,我建议使用带有推送通知的WebSocket界面。

或者,在上面的建议中,我可能建议将连接保持500-1000ms,并在返回404之前在服务器上检查两次,以减少在客户端创建多个连接的开销。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/405950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档