【问题标题】:Microservices async operation HTTP response微服务异步操作 HTTP 响应
【发布时间】:2017-10-10 04:24:22
【问题描述】:

我们正在构建一个微服务应用程序,客户可以在其中创建项目。下图展示了这个过程的技术流程:

我的问题:API 网关应该向客户端返回什么 HTTP 响应(步骤 1。)?

我最初的想法是返回 202,但问题是我还不知道 Location (/projects/{id}),因为 project 的 id 将是在项目管理服务处创建。

【问题讨论】:

  • 何时生成 ID,在创建命令之前/之后(即 GUID)或在持久化 project 之后(即自动递增的主键)?
  • 项目ID由项目管理服务生成。所以在它接收到命令之后,在它发布事件之前。
  • 太糟糕了,这让事情变得复杂了。所以,当你向客户端返回响应时,你不知道项目的 ID 和命令的状态是什么,对吧?
  • 没错。我们唯一知道的是命令被确认。
  • 因此,您将需要一个由 api 网关生成并返回给客户端的 command id,如下所示:/pending/commands/1234-abcd-5678-efgh

标签: http asynchronous architecture microservices event-driven


【解决方案1】:

考虑到新创建的project 实体的ID 在请求时是未知的(即它是在插入数据库后生成的),您确实无法生成project 资源的url。

相反,您可以在发送到总线之前为命令分配一个 ID(即1234-abcd-5678-efgh),并在 API 网关本身上跟踪其执行状态。然后您可以使用/commands/1234-abcd-5678-efgh 这样的命令执行状态端点响应客户端,它可以通过轮询进行查询。

替代方法是使用另一种服务来保留和传递唯一 ID,但您必须对其进行阻塞调用,这会损害可伸缩性。或者,您可以在 API 网关本身(在同一节点上)托管此服务,以最大限度地减少延迟。此外,在项目创建失败的情况下存在丢失一些 ID 的风险,但可以通过在这些情况下释放这些 ID 来弥补(从而增加架构复杂性)。

第三种解决方案可能是使用 project 代理 ID,如 GUID,分配为命令中包含的 project 的属性,具有仅可用于过程的预创建阶段。然后,对客户端的响应可能是这样的:/projects/by-guid/1234-abcd-5678-efgh,在创建project 之后,GET 到这个url 将永久重定向到最终的项目 url。

【讨论】:

    猜你喜欢
    • 2020-02-06
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多