Architecture 异步微服务体系结构中的同步通信

Architecture 异步微服务体系结构中的同步通信,architecture,publish-subscribe,microservices,Architecture,Publish Subscribe,Microservices,我试图从我的单片应用程序pet项目中提取一些服务,主要是作为一个学习练习。我正在使用AMQP(RabbitMQ)进行服务之间的通信,这很好。但是,我无法将web前端与应用程序的其余部分分离。web服务负责视图和UI逻辑,但需要查询后端“核心”服务中的主数据。AMQP似乎不适合这样做,因为前端服务需要等待响应,而且响应时间非常关键。我的第一个想法是为这条通信线路实现一个REST接口,但同一个服务也使用AMQP订阅其他服务的通信 这似乎应该是一个相当普遍的现象,但我还没有找到任何答案 我想我的主要问

我试图从我的单片应用程序pet项目中提取一些服务,主要是作为一个学习练习。我正在使用AMQP(RabbitMQ)进行服务之间的通信,这很好。但是,我无法将web前端与应用程序的其余部分分离。web服务负责视图和UI逻辑,但需要查询后端“核心”服务中的主数据。AMQP似乎不适合这样做,因为前端服务需要等待响应,而且响应时间非常关键。我的第一个想法是为这条通信线路实现一个REST接口,但同一个服务也使用AMQP订阅其他服务的通信

这似乎应该是一个相当普遍的现象,但我还没有找到任何答案

我想我的主要问题是当一个服务需要同时提供同步和异步通信时该怎么做。我还使用Ruby,它不适合在两个接口上侦听多个线程。我考虑了几件事:

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

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

工作完成后,您可以考虑创建视图模型,该模型通过数据分发的发布/订阅组合(不是完整数据集,而是上下文数据,即产品价格变化)来反映数据的业务状态(不是瞬态OLTP数据)

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


有意义吗?

在服务之间的同步通信中,使用RPC和protobuf比使用REST更有好处。同时,有两个同步和异步通信是非常常见的事情,但我不熟悉Ruby多线程问题。当服务使用队列订阅事件时,从订阅服务的角度来看,这实际上是一个同步传入调用。从发送方的角度来看,它是异步的,发送方不应该知道和关心接收方。