bunny-rest-proxy: 基于RabbitMQ的微服务异步API

22-03-28 banq

Bunny REST Proxy 是一个构建在 RabbitMQ 之上的 HTTP 消息代理。它允许服务通过 HTTP 轻松地将消息发布到 RabbitMQ 队列,并使用拉 (HTTP GET) 和推送 (HTTP POST 到订阅者) 交付模式来使用消息。
虽然 RabbitMQ 通常用作微服务之间的异步通信手段,但有时您需要使用更简单的 REST API 发布消息或使用消息,而不会影响消息传递保证。
 
特征
  • 通过 REST API 将消息发布到 RabbitMQ 队列中,使用带有发布者确认的通道实现可靠的消息传递
  • 支持二进制和 JSON 消息(带有服务器端模式验证)
  • 通过 HTTP 将消息推送到定义的订阅者,确保至少一次交付语义,并具有可配置的退避策略和死信策略
  • 使用队列中的消息 HTTP GET 请求
  • 基于单个 YAML 文件的直接配置


详细点击标题
 
作者意图与项目上下文背景:
使用AMQP连接并不总是方便/可行的,所以我最终在Node.js中建立了一个HTTP消息代理(推/拉消费;至少一次/最多一次的语义),在RabbitMQ之上,有点类似于AWS SQS;Bunny REST Proxy

事后总结:

在最近的一个项目中,我正致力于将两个现有的传统Web应用程序、CRM系统和IoT设备连接到一个基于微服务的后端,该后端使用RabbitMQ作为异步通信的手段。我很快就遇到了一个重要的问题,即从各种脚本能力有限的地方发布消息(其中AMQP客户端不可用,但HTTP客户端可用)。虽然 RabbitMQ 的管理插件暴露了一个允许发布消息的 HTTP API,但事实证明,它并没有实现可靠的消息传递。因此,在一些罕见的故障情况下,它有可能向客户端发送确认消息交付的响应,尽管它并没有在代理中持久化,这在分布式系统中是一个大忌,因为它的目标是实现至少一次的消息交付语义。为了缓解这种情况,我决定用我最喜欢的堆栈(Fastify + Typescript)编写一个简单的 Node.js 应用程序,它将充当一个代理,暴露 REST API 以将消息发布到 RabbitMQ 队列中。

在实现了一个用于将消息发布到 RabbitMQ 的赤裸裸的 REST 代理之后,我遇到了一些用例,在这些用例中,通过 HTTP GET 消费消息或以类似 webhook 的方式将它们自动推送到 HTTP POST 端点是有益的。这时我决定将现有的Node应用变成一个开源项目。在实现了订阅者和消费者之后,它基本上变成了一个建立在RabbitMQ之上的HTTP消息代理。

到目前为止,Bunny REST Proxy具有一些更高级的功能,如6种不同的回退策略(用于延迟消息交付重试)和3种不同的死信策略(指定如何处理超过最大交付重试次数的消息)。在发布者方面,它可以验证消息是否符合指定的模式(如果是JSON发布者)。它还具有ACL风格的授权,可横向扩展,其整个配置可由一个yaml文件提供。