Rails - 确保每个用户只能同时控制一个控制器

时间:2015-04-24 01:19:24

标签: ruby-on-rails ruby-on-rails-4 concurrency debouncing

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

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

有关此体系结构的更深入描述,请查看this semi-related question

正如那里详细说明的那样,我对这个内部控制器的每个请求占用了服务器时间(并且在Heroku上,绑定了一个dyno)。我试图尽可能快地采取行动,但我仍然希望减少服务器的数量。

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

我正在对用户输入进行去抖动(0.4秒),因此直到用户暂时停止输入时才会发出请求。但是如果用户在键入时暂停几次,并且每次请求都会消失,这很快就会导致多个dynos被使用。

  

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

这要么花费我一大笔钱(如果我有一大堆用户,这意味着大量的dynos可以防止并发超时)或者导致用户面前真的很烦人的等待。

所以我的想法,如果我基本上可以在服务器端进行追溯性反弹,通过在发送新请求之前终止来自该用户的任何正在运行的Foursquare请求,这将是非常棒的。这意味着在上面的具体例子中,当3个请求开始时,只有最后一个请求会返回,因为当新的请求进入时,前两个请求将被丢弃。

  

我正在考虑在session中存储一些变量,以便在执行请求时将每个变量都存在。然后,如果触发了下一个请求,它就不会熄灭。但这实际上与我想要的完全相反,因为我希望原始请求在新的请求被取消时取消。我只是不知道如何访问来自后者的请求。

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

谢谢!

0 个答案:

没有答案