Stalker / beanstalk异步处理作业

时间:2012-11-14 16:47:59

标签: ruby asynchronous beanstalkd

好的我正在使用Stalker和Beanstalkd进行一些测试。我的目标是将500kb的后置请求卸载到队列并异步处理它们。

到目前为止,在我的测试中,我有一个非常简单的例子。

#worker.rb
require 'stalker'
include Stalker

job 'hello' do |args|
  puts "hi"
  sleep 1
  puts "hello"
end

和此文件用于添加到队列

# stalker.rb
require 'rubygems'
require 'stalker'

10.times do 
    Stalker.enqueue('hello')
    puts 'queued'
end

所以在一个终端我运行

  

$ stalk worker.rb
  工作1个工作:[你好]

然后我运行潜行者档案

  

$ ruby​​ stalker.rb

追踪者几乎立即按预期执行,因此没有阻止。

但工人大约需要10秒钟才能运行。我真的希望这10个工作更接近1秒,因为我希望它们并行运行。

关于下一个最佳步骤的任何建议吗?

更新: 我已经意识到我可以从不同的终端运行多个工作人员,它会更快地处理队列,例如2名工人将在大约一半的时间内完成这一过程。

2 个答案:

答案 0 :(得分:1)

作为一个提示,您可能想要查看我创建的名为Backburner的新gem,这是一种更现代的方法来管理ruby中beanstalkd的异步作业。它遵循一个更干净的resque-esque接口,具有真正的异步工作程序(使用分叉和多个线程以实现更快的吞吐量)并且具有更好的错误处理和重试支持。在写backburner之前我使用了潜行者2年,因为我想要一个更好的解决方案。

它为您提供以下支持:

SomeObject.async(:pri => 1000, :delay => 2).some_method(1, 2, 3)
然后

将该方法自动排入beanstalkd并由backburner worker异步处理。

答案 1 :(得分:0)

Stalker.enqueue有3个选项:作业名称字符串,参数哈希,选项哈希。 在选项哈希中,您可以传递启动所需的秒数。 例如:

Stalker.enqueue('hello',{},{:delay => 5})