REST API 和消息传递

REST APIs and messaging

我有一个系统公开了一个 REST API 和一组丰富的 CRUD 端点来管理不同的资源。 REST API 也由前端应用程序使用,该应用程序通过使用 Ajax.

执行调用

我想让其中一些调用异步并增加可靠性。

显而易见的选择似乎是消息代理(ActiveMQ、RabbitMQ 等...)。

以前从未使用过消息代理,我想知道它们是否可以 "put in front of" REST API 而无需重写。

我不想仅通过消息系统访问 REST API:对于某些端点,调用必须始终是同步的,可靠性不太重要(主要是因为如果用户收到错误即时反馈)。

对于此用例,完整的 ESB 是否是更好的选择?

如果我理解你的问题,你想 "register" 一个 API 端点作为订阅者,以便它可以接收发送到给定队列的消息。

我不认为可以配置消息代理来执行此操作。

例如,如果您想使用消息代理,您的生产者和订阅者都需要使用 JMS API。

我不知道是否可以实施一个订阅者来执行相应的 API 调用。在这种情况下,可靠性会受到影响,因为消息将在执行 API 调用之前出列。如果订阅者在 API 的同一进程中 运行 是有意义的,但在这种情况下,不清楚为什么应该使用 REST API 而不是库。

Google 云 sub/pub 可能值得研究一下? - https://cloud.google.com/pubsub/docs/overview

IMO @EligioEleuterioFontana 你对角色有误解:

  • 一个RESTfulApi
  • 消息代理

这是两个不同的子系统,提供不同的服务。

现在,让我们根据您的要求解释他们的作用

  • 您的客户端(桌面浏览器、移动 phone 浏览器或应用程序)需要 get/push 数据到您的系统。 (来自 REST API 提及的假设)。
  • 来自客户的请求正在使用 HTTP/HTTPS(这是您要求的 REST API 部分)。
  • 任何推送的数据,您都希望使其响应更快、更快速、更可靠。

如果我没猜错,我会这样回答:

  • 所有客户端都需要将请求推送到 REST API,因为这不仅仅是简单的 CRUD。 Api 还处理安全(身份验证和授权)、缓存,甚至可能是请求限制等事情。

  • REST API 应该始终是客户端的前端,因为这也是 'hides' API 使用的子系统。用户永远不应该 see/know 关于您的任何子系统选择(例如,您正在使用什么数据库。您是否缓存?如果是,使用什么?等)。

  • Message Brokers 非常适合卸载现在 请求的工作并在以后 处理工作。有很多方法可以做到这一点(队列或 pub/sub 等),但这里的重点是这是客户永远不应该看到或知道的决定。

  • MB 也非常适合弹性(如您所述)。如果出现故障,队列中的消息将在 'x' 时间后重新尝试……等等(不,我不会提到毒队列、死信队列等)。

您可以有一些同步的 Api 端点。当然!然后让其他人利用一些最终的一致性(即对于那个请求,我稍后会处理它(即使稍后在 5 秒后)并且只是 return 对客户的回应说“谢谢!明白了!我很快就会做”)。这就是您所追求的异步工作流。

API 端点需要简单、简洁并且希望非常稳定。当您改变事物时,您在幕后所做的事情有望对客户隐藏起来。这包括使用消息代理。


无论如何,这是我对 REST APIs 和 Message Brokers 以及它们之间的关系的看法。