【问题标题】:How can I retrieve data onscreen from an external API without tying up a request?如何在不绑定请求的情况下从外部 API 检索屏幕上的数据?
【发布时间】:2014-04-04 17:55:43
【问题描述】:

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

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

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

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

感谢任何人就该问题提供的任何帮助或见解!

【问题讨论】:

  • 明确一点,需要在后台任务完成时向客户端发回大量数据?您应该能够通过 Pusher 发回任意数量的 json。我在这里错过了什么?
  • 我很快就达到了 10K 的限制。

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


【解决方案1】:

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

我也考虑过使用 Sidekiq,但如果您不希望立即使用数据,Sidekiq 是理想的选择,因此 memcache 和线程工作得很好,并为我们提供了很好的控制权。

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

从 UI 中,我将拥有一个基本的 ajax 池机制,该机制将访问控制器并检查 memcache 中的数据和状态以查看它是否已完成,这将标记 UI,它需要继续池以获取更多信息数据。

【讨论】:

  • 那么,是这样的吗? # 调用一次 def search dc = Dalli::Client.new('localhost:11211', options) Thread.new { dc.set("#{current_user}_results", MyApi.get_external_results(foo) } end # 多次调用来自 Ajax 请求 def get_results dc = Dalli::Client.new('localhost:11211', options) @results = dc.get("#{current_user}_results") end
  • 是的,类似的东西。但本质上就是这样。
  • 这非常有效。我正在使用 setTimeout 对完整操作进行 JS 长轮询,以避免向服务器发送垃圾邮件。我在一个模型方法中进行 API 调用和数据收集,该方法产生一个线程并将结果分配给 Rails.cache,即 :dalli_store。控制器有一个由 JS 长轮询器命中的 poll 方法,该方法检索缓存值。如果接收到的数据是空白的,长轮询器的成功方法什么也不做。控制器方法在获得值后立即删除缓存键,以避免重复发送数据。您的回答非常棒,非常有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 2017-04-15
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
  • 2022-12-31
  • 1970-01-01
相关资源
最近更新 更多