Dojo
最新
最佳
搜索
订阅
解道Jdon
架构设计
领域驱动
DDD介绍
DDD专辑
战略建模
领域语言UL
领域事件
商业分析
工作流BPM
规则引擎
架构师观点
数据工程
产品经理
系统思维
微服务
微服务介绍
微服务专辑
模块化设计
SOA
API设计
clean架构
SpringBoot
分布式事务
事件溯源
Kafka消息
Kubernetes
DevOps
编程设计
GoF设计模式
模式专辑
面向对象
函数式编程
编程语言比较
编程工具比较
形式逻辑
前端编程
Reactive编程
Jdon框架
Rust语言
人工智能
Web3
模因梗
幽默梗
程序员吐槽
面试技巧
Java入门
数字化转型
认知偏差
道德经
更多话题
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文件提供。
消息队列系统
微服务架构
RabbitMQ
RESTful风格