如何根据请求捕获响应然后执行某些操作?
How can I catch the response on request and then execute something?
我有一个应用程序,其中有一个端点,请求由另一个服务发送到该端点,以收集从我的应用程序到该服务的请求。然后该服务执行请求并将响应发送到另一个端点。
假设我有终点 (api/get_cost
),我们在该终点向客户提供成本信息。我们只是从另一项服务中获取成本信息。因此,在响应用户之前,我必须创建一个成本信息请求,获得响应,然后才响应用户。如何从架构的角度最好地做到这一点?
我认为有 2 件事你可以做。
让我们简化一下。
您在给定用例中有 2 个组件。
客户(用户)U1 --(想使用 api/get_cost
获取成本信息)--> B1(您的后端服务器)---> C1(第 3 方 API 服务器)
方法一:
在这种情况下,您可以在您的 lib 文件夹中创建一个服务,该服务将有一个客户端负责进行 api 调用和一个作为接口的服务,您将通过该接口公开方法来进行 api 从 B1 调用到 C1。
因此,您将使用服务方法对 C1 进行 api 调用。
一个快乐的案例是:
U1 从 B1 请求成本信息 -> B1 询问 C1 -> C1 响应数据 -> B1 响应数据给 U1
可能出错的地方:
U1 -> B1 -> C1(但 U1 的服务器已关闭) -> (超时) -> 返回 B1 -> B1 给 U1 错误。
U1 -> B1 -> C1(C1需要很多时间来回复) -> 回复数据给B1 -> B1把数据回复给C1
所以,让它更可靠。
在调用 B1 -> C1 时添加超时,这样如果在特定时间内未收到数据,您将向用户显示错误。
您可以在 B1 -> C1 之间添加缓存,例如:(如果用户想要获取项目 1 的数据,您从 C1 请求数据然后缓存它并将它的过期时间设置为 15分钟(取决于您))。现在下次用户要在 15 分钟内请求相同的数据时,数据将从缓存中获取,而不是从 C1 中获取)。注意:这也取决于它的数据类型。如果您认为数据是动态的并且每 2 分钟更改一次,那么就不需要添加缓存。
另一种方法,但需要更多的努力:
方法二:
使用短轮询。可以用在对获取数据有严格要求的场景,不管是4秒还是2秒。
您可以触发从 B1 到 C1 的通信的后台作业,并使用 uuid 或请求 ID 将响应返回给 U1,并在后台作业中转发它。
像这样维护 redis 中的作业状态:{request id: { uuid: 123, status: (started, failed, successful), data: {}}}
在后台作业中,在获取响应时根据请求 ID 更新 redis 数据。
同时创建一个 api 以根据您收到的请求 uuid 检查状态并定期轮询 api,直到您收到失败或成功)。您还可以限制时间,如果状态保持“已启动”,系统将不会在 2 分钟后轮询 api。
我知道这比预期的要多一点:3。此外,在软件架构中,没有好坏之分。只有取舍。
我有一个应用程序,其中有一个端点,请求由另一个服务发送到该端点,以收集从我的应用程序到该服务的请求。然后该服务执行请求并将响应发送到另一个端点。
假设我有终点 (api/get_cost
),我们在该终点向客户提供成本信息。我们只是从另一项服务中获取成本信息。因此,在响应用户之前,我必须创建一个成本信息请求,获得响应,然后才响应用户。如何从架构的角度最好地做到这一点?
我认为有 2 件事你可以做。
让我们简化一下。 您在给定用例中有 2 个组件。
客户(用户)U1 --(想使用 api/get_cost
获取成本信息)--> B1(您的后端服务器)---> C1(第 3 方 API 服务器)
方法一:
在这种情况下,您可以在您的 lib 文件夹中创建一个服务,该服务将有一个客户端负责进行 api 调用和一个作为接口的服务,您将通过该接口公开方法来进行 api 从 B1 调用到 C1。
因此,您将使用服务方法对 C1 进行 api 调用。
一个快乐的案例是: U1 从 B1 请求成本信息 -> B1 询问 C1 -> C1 响应数据 -> B1 响应数据给 U1
可能出错的地方:
U1 -> B1 -> C1(但 U1 的服务器已关闭) -> (超时) -> 返回 B1 -> B1 给 U1 错误。
U1 -> B1 -> C1(C1需要很多时间来回复) -> 回复数据给B1 -> B1把数据回复给C1
所以,让它更可靠。
在调用 B1 -> C1 时添加超时,这样如果在特定时间内未收到数据,您将向用户显示错误。
您可以在 B1 -> C1 之间添加缓存,例如:(如果用户想要获取项目 1 的数据,您从 C1 请求数据然后缓存它并将它的过期时间设置为 15分钟(取决于您))。现在下次用户要在 15 分钟内请求相同的数据时,数据将从缓存中获取,而不是从 C1 中获取)。注意:这也取决于它的数据类型。如果您认为数据是动态的并且每 2 分钟更改一次,那么就不需要添加缓存。
另一种方法,但需要更多的努力:
方法二:
使用短轮询。可以用在对获取数据有严格要求的场景,不管是4秒还是2秒。
您可以触发从 B1 到 C1 的通信的后台作业,并使用 uuid 或请求 ID 将响应返回给 U1,并在后台作业中转发它。
像这样维护 redis 中的作业状态:{request id: { uuid: 123, status: (started, failed, successful), data: {}}}
在后台作业中,在获取响应时根据请求 ID 更新 redis 数据。
同时创建一个 api 以根据您收到的请求 uuid 检查状态并定期轮询 api,直到您收到失败或成功)。您还可以限制时间,如果状态保持“已启动”,系统将不会在 2 分钟后轮询 api。
我知道这比预期的要多一点:3。此外,在软件架构中,没有好坏之分。只有取舍。