所以,我们正在设计一种新的微服务架构。其中最大的挑战之一是内部通信。对于需要响应的通信,我们使用REST API。但是对于只想中继信息的服务来说,这种API处理是不必要的开销。
一种方法是使用队列。Service1将信息推入队列,Service2可以从队列中消费。因此,Service1无需等待(不像API调用)。 (如果在处理信息时出现任何错误,则Service2可以通过回调URL向Service1发送通知,或以其他方式发送通知;这在此时不是问题[1])。
现在有两个选项,一个是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提供程序代替队列吗?
一种方法是使用队列。Service1将信息推入队列,Service2可以从队列中消费。因此,Service1无需等待(不像API调用)。 (如果在处理信息时出现任何错误,则Service2可以通过回调URL向Service1发送通知,或以其他方式发送通知;这在此时不是问题[1])。
现在有两个选项,一个是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提供程序代替队列吗?