我们正在构建一个微服务应用程序,客户可以在其中创建项目。下图展示了这个过程的技术流程:
我的问题:API 网关应该向客户端返回什么 HTTP 响应(第 1 步)?
我最初的想法是返回 202,但问题是我还不知道 Location
(/projects/{id}
),因为 项目 的 ID 将在项目管理服务中创建。
最佳答案
考虑到新创建的 project
实体的 ID 在请求时是未知的(即它是在插入数据库后生成的),您确实无法生成 的 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。
关于http - 微服务异步操作 HTTP 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43910795/