0

tl;dr - 有没有办法确保给定的 Rails 控制器操作在来自同一用户的另一个同时请求进来时停止执行?

在我的 Rails/Angular 应用程序中,我从客户端向 Foursquare API 发出请求。因为它们需要进行身份验证,并且我的身份验证信息应该保持安全,所以我通过我自己的应用程序中的 Rails 控制器传递这些请求。

有关此架构的更深入描述,请查看此半相关问题

正如那里所阐述的那样,我担心的是,对这个内部控制器的每个请求都会占用服务器时间(并且在 Heroku 上,会占用一个测功机)。我试图尽可能快地采取行动,但我仍然想减少服务器被占用的数量。

我正在做的搜索的实时性加剧了服务器的占用量。该请求作为用户类型发送到我的服务器,而不是输入或任何内容,因为我想允许自动建议。

我正在消除用户输入的抖动(0.4 秒),因此在用户短暂停止输入之前不会发出请求。但是,如果用户在输入时暂停了几次,并且每次都发出一个请求,这可能会很快导致使用多个测功机。

更具体地说,假设 Foursquare 的 API 响应时间约为 1.3 秒,想象一下这种情况:用户输入“ameri”,然后等待 0.4 秒,然后输入“can”,然后等待 0.4 秒,然后输入“beauty”,完成他们的询问。这将发送三个单独的请求,所有这些请求都需要由不同的测功机处理,因为在下一个请求进入之前,没有一个请求有机会返回。

这要么会花费我一大笔钱(如果我有一群用户,这意味着需要大量的测功机来防止并发超时),要么会在用户面前造成非常烦人的等待。

所以我的想法是,如果我可以在服务器端进行追溯去抖动,通过在发送新请求之前终止来自该用户的任何正在运行的 Foursquare 请求,那将是非常棒的。这意味着在上面的具体示例中,虽然启动了 3 个请求,但只有最后一个请求会返回,因为前两个请求会在新请求进入时被丢弃。

我正在考虑session为每个变量存储一些变量,这在请求执行时是正确的。然后,如果它被触发,下一个请求就不会出去。但这实际上与我想要的相反,因为我希望在新请求进来时取消原始请求。我只是不知道如何从后者中访问该请求。

这感觉很复杂,所以我猜这可能是不可能的(特别是当每个控制器动作都由一个新的控制器实例响应时),但是如果同一个动作再次被同一个用户击中,有没有人知道取消控制器动作的方法当第一个请求得到解决时?

谢谢!

4

0 回答 0