代码之家  ›  专栏  ›  技术社区  ›  Ross

什么是监视REST资源更改的RESTful方法?

  •  36
  • Ross  · 技术社区  · 15 年前

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

    我这样做的一个想法是提供特定的资源来保持连接的开放性,而不是在资源(还)不存在时立即返回。例如,给定资源:

    /game/17/playerToMove
    

    “抓住”这个资源可能会告诉我,轮到我的对手移动了。与其不断轮询此资源以确定何时轮到我移动,我可能会记下移动编号(比如5),并尝试检索下一个移动:

    /game/17/move/5
    

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

    PUT /game/17/move/5
    

    这类计划是否令人安心?还是违反了某种休息原则?

    3 回复  |  直到 9 年前
        1
  •  28
  •   Community Egal    7 年前

    你提出的解决方案听起来像 long polling ,这可能很有效。

    你会要求 /game/17/move/5 在移动5完成之前,服务器不会发送任何数据。如果连接中断,或者出现超时,只需重新连接,直到得到有效响应。

    这样做的好处是速度非常快——一旦服务器有了新数据,客户端就会得到它。它还具有对断开连接的恢复能力,并且在客户端断开连接一段时间(您可以请求 移动一小时后,立即获取数据,然后移动到 move/6/ (等等)

    twisted (一个“事件驱动的网络引擎”)在这方面很好,但它比常规的轮询需要更多的工作。。

    在回答您关于Jetty/Tomcat的评论时,我对Java没有任何经验,但它们似乎都使用了与Apache类似的工作线程池系统,因此它也会遇到同样的问题。我确实找到了 this post

        2
  •  2
  •   Ross    15 年前

    this article 提出了一个新的HTTP头,“When Modified After”,它基本上做了相同的事情——服务器等待并保持连接打开,直到资源被修改。

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

        3
  •  2
  •   Tracker1    3 年前


    2021年编辑:上面的答案是2009年的上下文。

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