Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
微服务异步操作HTTP响应_Http_Asynchronous_Architecture_Microservices_Event Driven - Fatal编程技术网

微服务异步操作HTTP响应

微服务异步操作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网关本身上跟踪其

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

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


我最初的想法是返回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