如何使用 RESTful Web 服务创建异步通知系统?

Posted

技术标签:

【中文标题】如何使用 RESTful Web 服务创建异步通知系统?【英文标题】:How would I create an asynchronous notification system using RESTful web services? 【发布时间】:2009-07-07 18:13:49 【问题描述】:

我有一个通过 RESTful Web 服务提供的 Java 应用程序。我想创建一种机制,以便客户端可以注册事件通知。问题是不能保证客户端程序将是 Java 程序,因此我将无法为此使用 JMS(即,如果每个客户端都是 Java 应用程序,那么我们可以允许客户端订阅 JMS 主题并在那里收听通知消息)。

用例大致如下:

    客户端通过 RESTful Web 服务调用向我的服务器应用程序注册自己,表明它有兴趣在特定对象更新时收到通知消息。 当感兴趣的对象更新时,我的服务器应用程序需要向所有有兴趣收到此事件通知的客户端发出通知。

正如我上面提到的,如果所有客户端都是 Java 应用程序,我知道该怎么做——设置一个客户端可以监听通知消息的主题。但是我不能使用这种方法,因为很多客户端可能无法收听 JMS 主题的通知消息。

这里有人能告诉我这个问题通常是如何解决的吗?我可以使用 RESTful API 提供什么机制?

【问题讨论】:

我实际上已经为我的公司构建了这样一个系统,并着眼于可能将其作为开源发布。它是用 Groovy 编写的,但不依赖于将 Groovy 安装在服务器上——它使用 Restlet 和 Java Services Wrapper 作为 Java 应用程序运行。它可以很容易地修改以在 Java 应用程序服务器中运行。它使用数据访问对象作为数据库的抽象层。它附带了一个用于 CouchDB 的适配器,但是为不同的 DB 实现一个适配器非常容易。你会对这个系统感兴趣吗,我会以开源的形式发布它吗? 【参考方案1】:

我能想到四种方法:

    一种 Twitter 方法:您注册客户端,然后它使用 GET 定期回调以检索任何通知。

    客户端描述它在发出注册请求时希望如何接收通知。这样一来,您可以为那些可以处理它的人允许 JMS,而对于那些不能处理的人则回退到电子邮件或类似的方式。

    在注册请求期间获取 URL,并在收到通知时分别回传给每个客户端。几乎没有发布/订阅,但效果会相似。当然,您会假设客户端正在侦听这些通知并已根据您的规范实现了客户端。

    购买 IBM WebSphere MQ (MQSeries)。有史以来最好的 IBM 产品。不是 REST,但它非常适合像这样的多平台集成。

【讨论】:

【参考方案2】:

我们遇到了这个问题,需要对相对较少的侦听器进行低延迟异步更新。我们的两个替代解决方案是:

    轮询: 用 GET 请求敲击你需要的资源列表 流式事件更新: 提供监视器资源。服务器保持连接打开。当事件发生时,服务器使用多部分内容类型或分块传输编码传输事件描述流。

【讨论】:

【参考方案3】:

在响应 RESTful 请求时,您可以提供客户端可以监控更新的个性化 RESTful URL。

也就是说,您有一个 URL(例如 /Signup.htm),它接受客户端的信息(如果适用,则为要监控的对象的 id)并返回自定义的 url (/Monitor/XYZPDQ),其中 XYZPDQ 是为该特定客户端创建的 UUID。客户端可以每隔一段时间轮询该自定义 URL,如果发生更新,它将收到通知。

如果您不关心客户端是谁(并且不想创建这么多 UUID),您可以为每个可能想要监控的对象设置单独的 RESTful URL,而“注册”URL 将只返回正确的。

正如 John Saunders 所说,您真的无法通过 HTTP 进行更直接的发布/订阅。

【讨论】:

【参考方案4】:

如果轮询不可接受,我会考虑使用web-sockets(例如see here)。虽然说实话我喜欢multipart content-type或chunked transfer-encoding as well.的idea suggested by user189423

【讨论】:

以上是关于如何使用 RESTful Web 服务创建异步通知系统?的主要内容,如果未能解决你的问题,请参考以下文章

用 Java 技术创建 RESTful Web 服务/@Path@Produces@PathParam

如何使用DRUPAL 8中的RESTful Web服务API创建field_collection_item

RESTful Web 服务如何正确生成 JSON?

如何使用后台模式从本地 Web 服务器创建本地通知

如何使用 Spring 安全性和 Restful Web 服务验证数据库中的凭据?

使用带有摘要身份验证、jquery ajax 调用的 RestFul PHP Web 服务