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

时间:2009-07-07 18:13:49

标签: events rest messaging notifications message

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

用例大致如下:

  1. 客户端通过RESTful Web服务调用向我的服务器应用程序注册自己,表明它有兴趣在特定对象更新时随时收到通知消息。
  2. 当感兴趣的对象更新后,我的服务器应用程序需要向有兴趣收到此事件通知的所有客户发出通知。
  3. 正如我上面提到的,如果所有客户端都是Java应用程序,我知道如何做到这一点 - 设置一个客户可以收听通知消息的主题。但是我不能使用这种方法,因为许多客户端可能无法收听通知消息的JMS主题。

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

4 个答案:

答案 0 :(得分:8)

我可以想到四种方法:

  1. Twitter方法:您注册客户端,然后定期使用GET回电以检索任何通知。

  2. 客户端描述了在发出注册请求时它希望如何接收通知。这样你可以允许JMS为那些能够处理它并回退到电子邮件或类似的那些那些不能。但

  3. 在注册请求期间获取一个URL,并在收到通知时单独POST回每个客户端。几乎没有Pub / Sub,但效果会相似。当然,您假设客户正在收听这些通知,并根据您的规范实施了客户。

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

答案 1 :(得分:4)

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

  1. 轮询:使用GET请求挖掘您需要的资源列表
  2. 流媒体事件更新:提供监视资源。服务器保持连接打开。当事件发生时,服务器使用多部分内容类型或分块传输编码来发送事件描述流。

答案 2 :(得分:3)

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

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

如果您不关心客户端是谁(并且不想创建这么多UUID),您可以为每个可能需要监控的对象分别使用RESTful URL,并且“注册”URL会只需返回正确的那个。

正如John Saunders所说,你无法通过HTTP真正做到更直接的发布/订阅。

答案 3 :(得分:1)

如果不接受投票,我会考虑使用web-sockets(例如see here)。虽然说实话,我喜欢idea suggested by user189423multipart content-type

chunked transfer-encoding as well.