如何在事件驱动的微服务架构中查询?

Nic*_*ico 6 event-driven cqrs microservices

假设基于CQRS架构的以下简单UC:

我们有一个管理商业对象的后端,让电影说.

  • 该后端由2个微服务组成:CommandManager(创建/更新/删除电影)和QueryManager(查询电影)
  • 我们有一个前端,提供用于创建新电影的网页,此操作自动引导到描述电影的另一个网页.

一个简单的方法是:

  • 网页使用表单收集电影信息并将其发送到前端.
  • 前端向CommandManager发出POST请求
  • CommandManager将新影片写入数据存储区并返回影片键
  • 前端使用此键对QueryManager进行GET
  • QueryManager使用密钥在数据存储区中查找电影并将其返回.
  • 前端提供带有电影信息的页面.

好的,现在我想以更多的事件驱动方式转换这个UC.这是新的流程:

  • 网页使用表单收集电影信息并将其发送到前端.
  • 前端使用新电影信息在BUS中写入消息
  • CommandManager侦听总线并在数据存储区中创建新电影.最终,它在BUS中发布一条新消息,指定已创建新电影.

此时,由于这种流是异步的,因此前端不再等待响应.我们如何完成此流程以将用户转发到电影信息网页?在查询QueryManager之前,我们应该等待创建过程完成.

在一个更通用的术语中,在基于总线/事件的异步架构中,如何执行用于在网页中提供信息的Query?

Con*_*enu 6

除了@ VoiceOfUnreason的回答,

如果两个微服务是RESTFul,则CommandManager可以返回一个202 Accepted带有指向将来创建的资源的链接.然后,客户端可以轮询该资源,直到服务器以a响应200 OK.

另一种解决方案是CommandManager返回a 202 Accepted,链接指向command/status端点.客户端将轮询该端点,直到状态为command-processed(包括实际资源的URL)或command-failed(包括失败的描述性消息).

可以通过使用服务器发送事件发送所有已处理命令的状态来扩充这些解决方案.通过这种方式,客户端无需轮询即可获得通知.

如果客户端不知道体系结构是异步的,则解决方案是使用API​​网关阻止客户端的请求,直到上游微服务处理命令,然后使用完整资源的数据进行响应.