微服务异步操作 HTTP 响应

Microservices async operation HTTP response

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

我的问题:API 网关 return 到客户端(第 1 步)的 HTTP 响应应该是什么?

我最初的想法是回馈一个202,但问题是我还不知道Location(/projects/{id}),因为[=21=的id ]project 将在项目管理服务中创建。

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

相反,您可以在发送到总线之前为命令分配一个 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.