REST中基于事件的交互方式

时间:2009-02-20 09:35:24

标签: rest

我目前正在努力解决涉及REST的设计问题。我正在设计的应用程序需要发送事件并支持pub / sub交互方式。在没有破坏REST的“无状态交互”约束的情况下,我无法想出提供这些交互风格的设计。我不是反对民意调查,因为有些人似乎(民意调查很糟糕),但我的申请需要基于事件和发布/互动的互动方式(民意调查对我来说不是一个选项)。所以,我的问题是:

  1. 我可以设计一个支持基于事件和发布/订阅交互的RESTful应用程序,而不会破坏REST约束吗?
  2. REST风格适合这种交互方式吗?

5 个答案:

答案 0 :(得分:17)

我推荐Duncan Cragg的Distributed Observer Pattern作为一个很好的阅读(有点难以理解,但值得付出努力)。

正如其他人已经指出,您可能需要使用轮询,但正如您所说,订阅者可以注册自己的兴趣(POST以创建订阅)。如果您将订阅视为自己的资源,即发布者和订阅者之间的合同,那么我不会将其视为严重的REST约束(请参阅 {第217页的状态和无状态 {3}} 了解应用程序和资源状态之间的区别)

答案 1 :(得分:2)

我认为您的意思是服务器应该通知客户有关事件。我不知道具体技术在这里如何重要:您将面临同样的问题,并且必须从同一个池中选择一个解决方案,无论使用REST,基于SOAP的Web服务还是任何其他替代方案。

基本问题是,您的服务器可以启动连接吗?补充这一点,客户可以收听端口吗?如果是,则客户端注册(子),服务器通知事件(pub)。注册操作和通知事件都可以是RESTful。

您需要服务器启动的连接和侦听客户端。如果其中一个不是一个选项(例如,因为客户端是一个Web浏览器),您将不得不使用轮询(如果您正在处理浏览器,您还可以查看类似websockets的内容)。仔细设计轮询:服务器对轮询事件的响应应指示客户端再次轮询之前的最小延迟。服务器的初始实现可以为此延迟值返回一个常量,但稍后(假设客户端表现良好),这将允许您控制服务器上的负载,区分关键客户端和不太关键客户端,等等上。

当然,民意调查可以是RESTful。

答案 2 :(得分:1)

我没有看到RESTful接口不支持事件的原因。

必须通过民意调查完成,请注意;即使您要使用SOAP,也是如此。

虽然您的Web服务器肯定应该保持无状态,但您可能在后端的某处有一个DB。您可以使用此DB通过添加订阅表来处理对事件的订阅。

答案 3 :(得分:0)

快速检查REST约束:

  • 客户端 - 服务器架构
  • 无国籍
  • 缓存
  • 统一界面
    • 资源识别
    • 通过表示操纵资源
    • 自我沮丧的消息
    • 应用程序状态引擎的超媒体
  • 分层系统
  • 按需代码(可选)

来自菲尔丁论文:

  

客户端 - 服务器样式是最常遇到的   基于网络的应用程序的架构样式。一台服务器   组件,提供一组服务,监听那些请求   服务。客户端组件,希望执行服务,   通过连接器向服务器发送请求。服务器也是   拒绝或执行请求并将响应发送回   客户端。

顺便说一下。基于事件的系统可能会违反大多数约束。如果没有客户端(因为hypermedia the engine of application state的另一个名称是application state)和超链接(因为它们对于pub / sub没有意义),很难定义client state之类的东西,等等。

无论如何,如何设计一个类似于REST的基于事件的系统是一个有趣的问题。我认为你应该发布包含RDF的自我描述性消息,但这只是一个提示。轮询可以是viable solution,但如果我是你,我不会尝试在基于事件的系统上强制使用REST ...

更新2016.05.15。

据我所知,客户端 - 服务器架构--Fielding在论文中描述了herehere - 总是使用REQ / REP通信。客户端发送请求,REST服务响应。如果你想拥有像PUB / SUB这样的东西而不违反客户端 - 服务器约束,那么唯一的方法就是使用轮询。如果你不想使用民意调查,那么。你可以一起使用REST服务和websocket服务,这是不被禁止的......

答案 4 :(得分:0)

Webhooks就是这个问题的答案。它们允许事件不违反REST原则。