【发布时间】:2017-02-24 19:05:05
【问题描述】:
我正在尝试从我的单体应用程序宠物项目中提取一些服务,主要是作为学习练习。我正在使用 AMQP (RabbitMQ) 进行服务之间的通信,效果很好。但是,我无法将 Web 前端与应用程序的其余部分分开。 Web 服务负责视图和 UI 逻辑,但需要查询后端“核心”服务以获取主要数据。 AMQP 似乎不太适合这种情况,因为前端服务需要等待响应,而响应时间很关键。我的第一个想法是为这条通信线路实现一个 REST 接口,但同样的服务也使用 AMQP 来订阅其他服务的通信。
这似乎应该是一个很常见的情况,但我一直无法找到任何答案。
我想我的主要问题是当一项服务需要同时提供同步和异步通信时该怎么办。我也在使用 Ruby,它不适合拥有侦听两个接口所需的多个线程。我考虑过的几件事:
- 仅使用 AMQP,发送带有
reply_to字段的消息,并阻塞直到收到响应。 - 提取核心后端服务的数据访问部分并为其提供 REST API。然后,Web 服务和“订阅”的部分都会查询其他服务。似乎没有必要为访问数据库提供服务。
- 拥有多个线程并使用某种事件循环来监听两个接口。似乎过于复杂。
【问题讨论】:
-
与使用 REST 进行服务之间的同步通信相比,使用 RPC 和 protobuf 会有好处。也有两个同步和异步通信是很常见的事情,但我不熟悉 Ruby 多线程问题。
-
当服务使用队列订阅事件时,从订阅服务的角度来看,这实际上是一个同步传入调用。从发送者的角度来看是异步的,发送者应该不知道也不关心接收者。
标签: architecture publish-subscribe microservices