我有一个Rails 3应用程序,允许用户通过API对第三方数据库执行搜索。它可能会带回相当多的 XML 数据。此外,API 可能忙于为其他用户提供请求,并且其响应时间有不平凡的延迟。
我只运行 2 个网络服务器,所以我显然无法承受延迟的请求。我使用 Sidekiq
来处理长时间运行的作业,但在我需要的所有情况下,我都不必向屏幕返回值。
我还使用 Pusher
在后台作业完成时与用户通信。我正在检查它,但我不知道它是否可以用于我想推送到屏幕上的那种数据。现在它只是弹出对话框,其中包含我发送的消息。
我想到了一些非常古怪的东西,比如通过 Sidekiq 运行请求,将结果发送到会话对象或文件,然后使用 Pusher 启动某种事件来获取数据并用它填充屏幕。似乎有点像鲁布·戈德堡。
我感谢任何人对问题的任何帮助或见解!
不久前我遇到了类似的情况,我的修复方法是使用 memcache 和线程。
我也考虑过使用 Sidekiq,但如果你不希望立即使用数据,Sidekiq 是理想的选择,所以 memcache 和线程运行得很好,给了我们很好的控制。
而不是直接调用 API,我会将 API 请求分配给一个线程,这个线程一旦完成就会写入 memcache,在我的情况下,这可以增量发生,同一个 API 能够从同一个端点返回更多数据,直到完成。
从 UI 中,我将有一个基本的 ajax 池化机制,该机制将命中控制器并检查 memcache 中的数据以及状态以查看它是否完整,这将签署它需要继续池化以获取更多数据的 UI。