0

抱歉标题令人困惑,很难想出一个适合我的问题的标题。

为了解释我要做什么,我将使用一个类似的示例:假设我想创建一个 API 调用,当提供一组术语时,它会在 Twitter 中搜索所有这些术语并返回推文。

一方面,我可以做一些简单的事情,例如(如果你原谅伪代码):

results = []
search_terms.each_with_index do |search_term, i|
  search_uri = "http://search.twitter.com/search.json?q=#{search_term}"
  twitter_result = ... #(URI.parse, Net:HTTP:GET, start, etc.)
  results[i] = twitter_result 
end
render :json => results.to_json

但是,当然,如果有几十个关键字,这可能会很慢——如果有超过 100 个关键字更是如此——因为 Ruby 必须等待每个请求开始下一个请求。

Heroku 的测功机似乎应该能够快速完成这项工作(例如,测功机概述指出“可以直接从测功机发出传出请求”)。然而,似乎访问这些的方法往往是通过延迟作业、Resque 等,它们的用例往往与我所概述的非常不同。

据我所知,这些利用多个测功机/工作人员的方法不会像典型线程那样可行:访问和修改由调用者/父函数实例化的实例变量。据我所知(如果我错了,请纠正我),通常他们使用自己的内存、自己的变量以及其他函数必须访问的任何内容都将通过缓存或数据库来完成。

好吧,所以这并不意味着这个想法是不可能的。一种解决方法可能是,在创建这些之后DelayedJobs,在从数据库中获取的父函数中运行一个无限循环(超时)并检查结果大小是否等于关键字的数量,否则会休眠一小段时间,再试一次. 将DelayedJobs在执行任务后创建这些行。这不是一个特别好的解决方案,最终会导致服务器的一些额外工作,但随着搜索次数的增加,这可能会比循环遍历它们要快得多。

所以这是问题(以及与第一个相关的几个相关问题):

我想知道的是,在 Heroku 上设置一个请求有多可行,该请求在被调用后会快速启动一些新工作人员,并行执行多个请求,然后在所有这些请求完成后响应调用者?

启动工人和执行任务所需的时间会DelayedJobs不会太长而无法完成这项工作?(希望整个请求的长度只有几秒钟。)

有没有关于请求的截止数量的建议,最好按顺序执行它们,而不是使用DelayedJobs? (我希望不会,而且我必须为此做一些试验和基准测试,以决定在什么时候路由到任一选项。)

我是否错过了可以简化此过程(或者更有效)的其他选项?

编辑:我也应该注意,额外的工人将根据需要使用 gem (比如hiresfire,或类似的东西)来增加——我不确定这会影响多少。

4

1 回答 1

1

从外部 API 检索信息是 Ruby 中的一项阻塞任务,这意味着您执行此请求的进程或线程在等待响应时基本上会休眠。

要在后台执行大量并发 I/O(例如搜索 Twitter、其他 HTTP 请求等),我在 Ruby/Rails 世界中选择的库是Sidekiq。您可以在 wiki 中了解它相对于 delay_job 和 resque 的效率和优势。

于 2012-12-03T21:12:01.087 回答