ruby-on-rails - 我将如何产生 Heroku 工作人员来分而治之关键字列表?

标签 ruby-on-rails ruby heroku process

我的 Heroku Rails 应用维护着一个经常变化的大型关键字列表。

我想派生出 N 个工作人员,这些工作人员将平均分配这个关键字列表并对其进行处理,直到它们重新启动(每次关键字列表更改时我都会重新启动它们)。重新启动后,它们会再次划分关键字并流失。

例如:假设我有 1,000 个关键字。

  • 如果我生成 1 个 worker ,该 worker 将获得 1,000 个关键字。
  • 如果我生成 10 个 worker ,每个 worker 将获得 100 个关键字。
  • 如果我生成 1,000 个 worker ,每个 worker 将获得 1 个关键字。

工作人员基本上只是为他们的关键字集打开与 Twitter 的连接,并处理与这些关键字匹配的传入推文。

关于如何设置 Procfile 并在 N 个工作人员之间委托(delegate) X 关键字有什么想法吗?


这是一个仅用于演示的天真/伪手动方法。但是,我希望能够产生任意数量的工作人员,这些工作人员会自动在他们之间拆分关键字。

简介:

keywordstreamer0: bundle exec ruby keyword_streamer.rb 0
keywordstreamer1: bundle exec ruby keyword_streamer.rb 1

keyword_streamer.rb

streamer_id = ARGV.shift # 0 or 1

# Split all keywords into array of two groups and take the group
# that matches this worker id (so the two workers take different groups)
keywords = Keyword.all.split_into_groups_of(2)[streamer_id]

# Example work loop
TwitterStream.track(keywords).each do |incoming_tweet|
  process(incoming_tweet)
end

然后,在我的应用中,当我需要重新启动我的关键字 worker 时:

["keywordstreamer0", "keywordstreamer1"].each do |streamer|
  restart(streamer)
end

我希望能够产生 N 数量的这些 worker ,但我在分配解决方案时遇到了问题。如果有任何高级概述建议,我将不胜感激!

最佳答案

如果您一次只处理一个关键字,没有特定的顺序或分组,您可以只使用队列。

每个工作人员只需从队列中取出下一个关键字(或者可能是下一批关键字,以提高性能),完成工作,然后将结果保存在某个地方。您无需担心工作负载的划分问题,因为工作人员会在准备就绪时简单地请求更多工作,从而允许您扩展到 N 个工作人员,而无需每个工作人员都知道可用工作负载的总大小。

您可以通过多种方式为您的数据实现队列。 AMQP 和 Redis 是我之前使用过的几个更专业的工具,但这并不是一个详尽的列表。

我要猜测一下,因为您的示例代码中有 Keyword.all,并且您使用的是 Heroku,所以您使用的是 postgres。您也可以在 postgres 中模拟一个队列而不会有太多困难,尽管它显然不会像专门构建的队列那样执行。

这是一种实现方式:

为您的关键字添加一个status 列。它将有 3 个值:就绪、进行中和完成。状态列的默认值为就绪。

您的工作人员的伪代码如下所示:

loop do
  keyword = Keyword.where(:status => "ready").limit(1).first
  keyword.update_attributes!(:status => "in-progress")

  result = process(keyword)
  save_result_somewhere(result)

  keyword.update_attributes!(:status => "complete")
end

我省略了一堆实现细节,例如优雅地处理空队列、队列的初始设置、批处理等等。但这就是它的要点。对于中等规模的 N,可能至少有 10 个或更多的 worker ,这应该足以执行。除此之外,您可能需要考虑一种专门构建的排队技术。

设置好队列后,每个工作人员都是相同且自主的。只需 heroku ps:scale worker=N 即可完成!

关于ruby-on-rails - 我将如何产生 Heroku 工作人员来分而治之关键字列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13182571/

相关文章:

ruby-on-rails - 可以在elasticsearch-rails中使用copy_to吗?

ruby-on-rails - 是否有可能以动态时间间隔运行 cron 作业?请建议

ruby-on-rails - 是否有 gem 可以规范化和格式化 ruby 中的美国电话号码?

heroku - 如何在 Heroku 上将 rake 任务作为工作进程运行?

heroku - 如果我为1个 worker dyno付费,我在1个Web dyno上运行的Heroku应用程序将保持激活状态吗?

ruby-on-rails - factory_girl transient 属性的未定义方法

ruby-on-rails - Rails 中的链接作用域方法

ruby - 如何使用 DST 偏移量获取 time_zone_options_for_select?

ruby-on-rails - 如何从 Resque worker 向客户端发送数据?

ruby-on-rails - "uninitialized constant"当包含测试助手模块时