异步微服务架构中的同步通信



我试图从我的单片应用程序宠物项目中提取一些服务,主要是作为学习练习。我正在使用AMQP (RabbitMQ)进行服务之间的通信,这工作得很好。但是,我在将web前端与应用程序的其余部分分开时遇到了麻烦。web服务负责视图和UI逻辑,但需要查询后端"核心"服务以获取主要数据。AMQP似乎不适合这种情况,因为前端服务需要等待响应,而响应时间是至关重要的。我的第一个想法是为这条通信线路实现一个REST接口,但是同样的服务也使用AMQP来订阅其他服务的通信。

这似乎是一个很常见的现象,但我还没能找到任何答案。

我想我的主要问题是当一个服务需要同时提供同步和异步通信时该怎么办。我还使用Ruby,它不适合拥有监听两个接口所需的多个线程。我考虑过的一些事情:

  • 仅使用AMQP,发送带有reply_to字段的消息,并阻塞直到收到响应。
  • 提取核心后端服务的数据访问部分,并给它一个REST API。然后,web服务和"订阅"的部分都将查询另一个服务。似乎没有必要为访问数据库提供服务。
  • 拥有多个线程并使用某种事件循环来监听两个接口。看起来太复杂了。

在构建分布式系统(SOA/微服务)时,您将使用CQS模型(命令查询分离),这可以转换为2个不同的通道,一个用于命令和事件,用于状态更改(异步消息传递),另一个用于查询,只读数据模型(同步读取)。

在你得到工作后,你可以看看创建视图模型,反映你的数据的业务状态(不是你的瞬态OLTP数据)与pub/sub数据分布的组合(不是完整的数据集,但上下文数据-即产品价格变化)

是的,它使事情变得更复杂,但有助于减少耦合,从而帮助您构建更好的系统

有意义吗?

最新更新