【发布时间】:2016-09-16 01:53:28
【问题描述】:
因此,我们正在设计一个新的微服务架构。最大的挑战之一是内部沟通。对于需要响应的通信,我们使用的是 REST API。但是对于只是想传递信息的服务来说,这种 API 处理是不必要的开销。
一种方法是使用队列。 service1 会将信息推送到队列中,service2 可以从那里消费。因此 service1 不必等待(与 API 调用不同)。 (如果在处理信息时出现任何错误,service2 可以通过回调 URL 到 service1 或任何其他方式通知;这不是问题[1])
现在有了Queue,有两种选择,一种是RabbitMQ。另一个是AWS SQS。使用 RabbitMQ,我不得不担心服务器设置和所有事情(可以完成,但想避免它)。因此,在 SQS 的 POC 之后,这似乎是一个不错的选择,但问题是 SQS 在内部使用 Rest API 与 AWS 服务器通信,在这两个点(推送时 service1,消费时 service2),都会有开销。所以现在我在想为什么不在 NodeJS 中这样做,service1 会向 service2 提供信息。 Service2 将立即响应,确认它已收到信息,如果有任何错误则 [1]。
现在我可以总结的优点/缺点是 -
RabbitMQ
- 易于实施
- 在接收方不可用的情况下,发送方不必担心重试。
- 服务器设置成本 + 维护(+ 调整)
SQS
- 最容易实施
- 定价
- 不断轮询消息
- 推送/接收开销
非阻塞 API
- 通信不需要第三种媒介
- Service1 必须管理重试机制
- 相对于 SQS,开销更少
- 信息将保留在内存中,直到处理完毕
所以对某些人来说,我的问题是,使用非阻塞 API 是个好主意吗?或者在使系统可扩展方面,哪种方法更好。
编辑 - 可以使用 PubNub 或 Pusher 等 PubSub 提供程序来代替 Queue 吗?
【问题讨论】:
-
问题中有一些有缺陷的前提。从技术上讲,SQS API 不是 REST API,如果是,我看不出它是如何令人反感的。如果 SQS 意味着轮询不是“恒定的”,那么长轮询机制就不会像自旋锁那样使用它。不完全确定在这个问题的上下文中“非阻塞 API”实际上意味着什么,因为队列的目的是在组件之间创建一个弹性缓冲区。这几乎似乎可以称为“基于意见”。
-
SQS 发出一个 HTTP 请求,这就是我的意思。非阻塞 API 是指节点应用程序将立即发送响应,确认它已收到请求,然后处理信息。
-
如果您的应用程序发送响应然后继续处理请求,如果您不将正在处理的请求存储在某处,以便在发生故障时不会丢失,您将遇到问题崩溃、错误、过载或其他任何问题。
-
@AshwaniAgarwal,生产者和消费者是否在您的基础架构内的 Intranet 中运行?如果您想使用 SQS 并且所有其他组件都在您的数据中心中,您可能需要咨询您的 OP 团队。
标签: node.js architecture queue rabbitmq amazon-sqs