0

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

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

#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

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

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

有关执行此操作的下一个最佳步骤的任何建议?

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

4

2 回答 2

1

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

它为您提供以下支持:

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

然后该方法会自动排入 beanstalkd 并由 backburner 工作人员异步处理。

于 2012-11-15T09:36:56.460 回答
0

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

Stalker.enqueue('hello',{},{:delay => 5})
于 2012-11-14T16:55:58.067 回答