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

标签 architecture publish-subscribe microservices

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

这似乎应该是一个很常见的情况,但我一直无法找到任何答案。

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

  • 仅使用 AMQP,发送带有 reply_to 的消息字段,并阻塞直到收到响应。
  • 提取核心后端服务的数据访问部分并为其提供 REST API。然后,Web 服务和“订阅”的部分都会查询其他服务。似乎没有必要为访问数据库提供服务。
  • 拥有多个线程并使用某种事件循环来监听两个接口(interface)。似乎过于复杂。
  • 最佳答案

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

    完成这项工作后,您可以考虑创建反射(reflect)数据业务状态(不是 transient OLTP 数据)的 View 模型,并结合 pub/sub 进行数据分发(不是完整数据集,而是上下文数据 - 即产品价格变化)

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

    有道理?

    关于architecture - 异步微服务架构中的同步通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40058568/

    相关文章:

    java - 模拟长序列对象(非 UUID)的服务/数据库/技术

    azure - Azure事件中心和多个使用者组

    spring-boot - 禁用分布式跟踪以进行开发

    javascript - 如何遍历 Meteor 模板中的所有现有用户?

    publish-subscribe - PubNub 到服务器的数据传输

    microservices - 使用微服务架构构建身份验证

    c# - 通过 RPC 与元数据进行服务结构通信

    java - Spring MVC : should service layer be returning operation specific DTO's?

    visual-studio-2010 - 将大型 DGML 图导出到 XPS

    .net - 管理 worker 的多个实例的架构?