微服务异步操作HTTP响应
我们正在构建一个微服务应用程序,客户可以在其中创建项目。下图显示了该工艺的技术流程: 我的问题:API网关应该向客户端返回什么HTTP响应(步骤1)?微服务异步操作HTTP响应,http,asynchronous,architecture,microservices,event-driven,Http,Asynchronous,Architecture,Microservices,Event Driven,我们正在构建一个微服务应用程序,客户可以在其中创建项目。下图显示了该工艺的技术流程: 我的问题:API网关应该向客户端返回什么HTTP响应(步骤1)? 我最初的想法是返回202,但问题是我还不知道位置(/projects/{id}),因为项目的id将在项目管理服务中创建。考虑到新创建的项目实体的id在请求时未知(即,它是在插入数据库后生成的)您确实无法生成指向项目资源的url 相反,您可以在发送到总线之前为命令分配一个ID(即1234-abcd-5678-efgh),并在API网关本身上跟踪其
我最初的想法是返回202,但问题是我还不知道
位置(/projects/{id}
),因为项目的id将在项目管理服务中创建。考虑到新创建的项目
实体的id在请求时未知(即,它是在插入数据库后生成的)您确实无法生成指向项目
资源的url
相反,您可以在发送到总线之前为命令分配一个ID(即1234-abcd-5678-efgh
),并在API网关本身上跟踪其执行状态。然后,您可以使用命令执行状态端点(如/commands/1234-abcd-5678-efgh
)响应客户端,它可以通过轮询进行查询
另一种选择是使用另一个服务,该服务将保留并提供唯一的ID,但您必须对其进行阻塞调用,这会影响可伸缩性。或者,您可以在API网关本身内部(在同一节点上)托管此服务同时,在项目创建失败的情况下,也有丢失一些ID的风险,但这可以通过在这些情况下释放这些ID来补偿(从而增加架构的复杂性)
第三种解决方案可以是使用项目
查询ID,如GUID,作为命令中包含的项目
的属性分配,其目的是提供一个只能在流程的预创建阶段使用的备用标识。然后,对客户机的响应可以是这样的:/projects/by guid/1234-abcd-5678-efgh
并且在创建项目
后,GET
到此url
将永久重定向到最终项目url。考虑到新创建的项目
实体的id在请求时未知(即,它是在插入数据库后生成的)您确实无法生成项目
资源的url
相反,您可以在发送到总线之前为命令分配一个ID(即1234-abcd-5678-efgh
),并在API网关本身上跟踪其执行状态。然后,您可以使用命令执行状态端点(如/commands/1234-abcd-5678-efgh
)响应客户端,它可以通过轮询进行查询
另一种选择是使用另一个服务,该服务将保留并提供唯一的ID,但您必须对其进行阻塞调用,这会影响可伸缩性。或者,您可以在API网关本身内部(在同一节点上)托管此服务同时,在项目创建失败的情况下,也有丢失一些ID的风险,但这可以通过在这些情况下释放这些ID来补偿(从而增加架构的复杂性)
第三种解决方案可以是使用项目
查询ID,如GUID,作为命令中包含的项目
的属性分配,其目的是提供一个只能在流程的预创建阶段使用的备用标识。然后,对客户机的响应可以是这样的:/projects/by guid/1234-abcd-5678-efgh
在创建项目
后,此url的GET
将永久重定向到最终的项目url。何时生成id,在创建命令之前/何时(即GUID)或在保存项目
之后(即自动递增主键)?项目id是由项目管理服务生成的。因此,在它收到命令后和发布事件之前。太糟糕了,这会使事情复杂化。因此,当您将响应返回给客户端时,您不知道项目id是什么,也不知道命令的状态,对吗?没错。我们唯一知道的是d已确认。因此,您需要api网关生成并返回给客户端的命令id
,如下所示:/pending/commands/1234-abcd-5678-efgh
您何时生成id,在创建命令之前/时(即GUID),还是在保存项目之后(即自动递增主键)?项目id是由项目管理服务生成的。因此,在它收到命令后和发布事件之前。太糟糕了,这会使事情复杂化。因此,当您将响应返回给客户端时,您不知道项目id是什么,也不知道命令的状态,对吗?没错。我们唯一知道的是d已确认。因此,您需要一个由api网关生成并返回给客户端的命令id
,如下所示:/pending/commands/1234-abcd-5678-efgh