http - 微服务异步操作 HTTP 响应

标签 http asynchronous architecture microservices event-driven

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

Create Project Flow

我的问题: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/

相关文章:

architecture - 腐烂设计和粘度

C:解决在 HTTP 上下文中使用 select 时部分 header 的情况

http - 在没有实体主体的情况下执行 HTTP POST 是否被认为是不好的做法?

azure - 将 ICloudBlob.UploadFromStream 转换为 Task.Factory.FromAsync(begin,end,params)

c# - Task.Factory.StartNew 和主 UI

ios - 在 Swift 2 中创建异步任务

sql - PostgreSQL:按记录数对数据进行分组的有效方法

Java 应用程序架构 - 需要一个日志记录名称,希望保持类解耦

http - 什么大小的缓冲区最适合将文件上传到互联网

ASP.NET 核心 : How to get remote IP address?