Ruby on rails 如何捕获请求响应,然后执行某些操作?

Ruby on rails 如何捕获请求响应,然后执行某些操作?,ruby-on-rails,wisper,Ruby On Rails,Wisper,我有一个应用程序,其中我有一个端点,请求由另一个服务发送,以收集来自我的应用程序到该服务的请求。然后,该服务执行请求并将响应发送到另一个端点 假设我有一个端点(api/get_cost),在这个端点上我们给客户一个成本信息。我们仅从另一项服务获取成本信息。因此,在响应用户之前,我必须创建一个成本信息请求,获得响应,然后才响应用户。从架构的角度来看,如何最好地做到这一点?我认为有两件事你可以做到 让我们简化一下。 在给定的用例中有两个组件 客户(用户)U1--(希望使用api/get_cost)获

我有一个应用程序,其中我有一个端点,请求由另一个服务发送,以收集来自我的应用程序到该服务的请求。然后,该服务执行请求并将响应发送到另一个端点


假设我有一个端点(
api/get_cost
),在这个端点上我们给客户一个成本信息。我们仅从另一项服务获取成本信息。因此,在响应用户之前,我必须创建一个成本信息请求,获得响应,然后才响应用户。从架构的角度来看,如何最好地做到这一点?

我认为有两件事你可以做到

让我们简化一下。 在给定的用例中有两个组件

客户(用户)U1--(希望使用
api/get_cost
)获取成本信息-->B1(您的后端服务器)--->C1(第三方api服务器)

方法1:

在这个场景中,您可以在lib文件夹中创建一个服务,该服务将有一个负责进行api调用的客户端和一个作为接口的服务,通过该接口,您将公开从B1到C1进行api调用的方法

因此,您将使用服务方法对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之间为eg添加缓存:(如果用户想要获取项目1的数据,您可以从C1请求数据,然后缓存它,并将其过期时间设置为15分钟(取决于您))。现在,下次用户要在15分钟内请求相同的数据时,数据将从缓存中获取,而不是从C1)。注意:这还取决于数据的类型。如果您认为数据是动态的,并且每2分钟就会更改一次,那么就不需要添加缓存

另一种方法,但需要更多的努力:

方法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。而且,在软件架构中没有好坏之分。只有折衷。

是的,我也考虑过第二种方法。非常感谢。太好了!玩得开心。