如何在不占用请求的情况下从外部API检索屏幕上的数据?

时间:2014-04-04 17:55:44

标签: ruby-on-rails ruby-on-rails-3 sidekiq pusher

我有一个Rails 3应用程序,允许用户通过API对第三方数据库进行搜索。它可能会带回相当多的XML数据。此外,API可能忙于为其他用户提供请求,并且响应时间有很大的延迟。

我只运行了2个网络服务器,所以我显然无法提供延迟请求。我使用Sidekiq来处理长时间运行的作业,但在所有情况下,我都需要我不必将值返回到屏幕上。

我还使用Pusher在后​​台作业完成时与用户进行通信。我正在检查它,但我不知道它是否可以用于我想要推送到屏幕的那种数据。现在它只是弹出对话框,其中包含我发送的消息。

我想到了一些非常怪异的东西,比如通过Sidekiq运行请求,将结果发送到会话对象或文件,然后使用Pusher启动某种事件来获取数据并用它填充屏幕。看起来像Rube Goldberg-ish。

我感谢任何人可以提供的任何帮助或见解!

1 个答案:

答案 0 :(得分:1)

我不久前遇到了类似的情况,我修复的方式是使用内存缓存和线程。

我也考虑过使用Sidekiq,但是如果你不希望立即使用数据,Sidekiq是理想的,所以memcache和线程工作得很好,给了我们很大的控制权。

我没有直接调用API,而是将API请求分配给一个线程,这个线程一旦完成就会写入memcache,在我的情况下,这可以逐步发生,同一个API能够从同一个端点返回更多数据直到完成。

从UI我将有一个基本的ajax池机制,它会击中控制器并检查memcache的数据和状态以查看它是否完整,这会在UI上签署它需要保持池以获得更多数据