我目前正在努力解决涉及REST的设计问题。我正在设计的应用程序需要发送事件并支持pub / sub交互方式。在没有破坏REST的“无状态交互”约束的情况下,我无法想出提供这些交互风格的设计。我不是反对民意调查,因为有些人似乎(民意调查很糟糕),但我的申请需要基于事件和发布/互动的互动方式(民意调查对我来说不是一个选项)。所以,我的问题是:
答案 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在论文中描述了here和here - 总是使用REQ / REP通信。客户端发送请求,REST服务响应。如果你想拥有像PUB / SUB这样的东西而不违反客户端 - 服务器约束,那么唯一的方法就是使用轮询。如果你不想使用民意调查,那么。你可以一起使用REST服务和websocket服务,这是不被禁止的......
答案 4 :(得分:0)
Webhooks就是这个问题的答案。它们允许事件不违反REST原则。