我已将Resque添加到我的Rails 3项目中.我创建了一个从DB读取/写入一些内容的作业.
问题是我没有看到SQL查询日志,例如"Post Load(0.5ms)SELECT"在终端中发布".*FROM"posts""了.我也没有看到我设置的任何Rails.logger消息.
当我再做一个请求(简单刷新)时,记录器消息和SQL查询日志突然出现.
什么想法可能会发生什么?谢谢
我刚刚开始使用resque在后台对一些非常大的文件进行处理,而我却无法弄清楚如何将文件传递给resque worker.我使用rails来处理文件上传,rails ActionDispatch::Http::UploadedFile为从表单上传的每个文件创建一个对象.
如何将此文件发送给resque工作者?我尝试发送一个只有临时文件的路径名和原始文件名的自定义哈希,但我不能再重新打开resque worker中的临时文件(只是正常Errno::ENOENT - No such file or directory),因为rails似乎在请求结束后删除了该临时文件.
我需要启动4个resque worker,所以我使用了以下命令
bundle exec rake environment resque:workers RAILS_ENV=production COUNT=4 QUEUE=* VERBOSE=1 PIDFILE=tmp/pids/resque_worker.pid >> log/resque_worker_QUEUE.log
Run Code Online (Sandbox Code Playgroud)
但是去网络界面,它实际上是8个工人.有两个父进程,每个进程有4个子进程.以下是过程的树视图:
ruby /code_base/bundle/ruby/1.9.1/bin/rake environment resque:workers RAILS_ENV=production COUNT=4 QUEUE=* VERBOSE=1 PIDFILE=tmp/pids/resque_worker.pid
\_ [ruby]
\_ resque-1.15.0: Waiting for *
| \_ [ruby]
\_ resque-1.15.0: Waiting for *
| \_ [ruby]
\_ resque-1.15.0: Waiting for *
| \_ [ruby]
\_ resque-1.15.0: Waiting for *
\_ [ruby]
ruby /code_base/bundle/ruby/1.9.1/bin/rake environment resque:workers RAILS_ENV=production COUNT=4 QUEUE=* VERBOSE=1 PIDFILE=tmp/pids/resque_worker.pid
\_ [ruby]
\_ resque-1.15.0: Waiting for *
| \_ [ruby]
\_ resque-1.15.0: Waiting for … 我在本地运行Redis并且有多台机器在同一个端口上与redis通信 - 是否有关于锁定Redis访问权限的好方法的建议?数据库在Mac OS X上运行.谢谢.
编辑:这是假设我不想在配置中使用内置(非向后兼容)Redis requirepass指令.
默认情况下,Resque中的父进程分支和子进程会创建与数据库的新连接.
这可以工作,但如果你有几十个工人,MySQL就无法保持打开很多连接并开始抛出错误.
让孩子们使用他们父母的MySQL连接的解决方案是什么?
我试图获得在Unicorn下运行的Rails应用程序连接到受密码保护的Redis服务器时出现意外和重大问题.
使用bundle exec rails c production命令行中,我可以通过Resque.redis发出命令.但是,当它在Unicorn下分叉时,我的配置似乎正在丢失.
使用非密码保护的Redis服务器Just Works.但是,我打算在其他服务器上运行工作程序,而不是Redis服务器所在的服务器,因此我需要密码保护.
我也成功地使用了密码保护(使用相同的技术)但使用Passenger而不是Unicorn.
我有以下设置:
# config/resque.yml
development: localhost:6379
test: localhost:6379
production: redis://user:PASSWORD@oak.isc.org:6379
Run Code Online (Sandbox Code Playgroud)
.
# config/initializers/redis.rb
rails_root = ENV['RAILS_ROOT'] || File.dirname(__FILE__) + '/../..'
rails_env = ENV['RAILS_ENV'] || 'development'
$resque_config = YAML.load_file(rails_root + '/config/resque.yml')
uri = URI.parse($resque_config[rails_env])
Resque.redis = Redis.new(host: uri.host, port: uri.port, password: uri.password)
Run Code Online (Sandbox Code Playgroud)
.
# unicorn.rb bootup file
preload_app true
before_fork do |server, worker|
Redis.current.quit
end
after_fork do |server, worker|
Redis.current.quit
end
Run Code Online (Sandbox Code Playgroud)
.
我正在使用sidekiq gem来处理Rails中的后台作业.出于某种原因,这项工作在一段时间后就会挂起 - 这个过程要么变得反应迟钝,要么出现top但没有多少,或者神秘地消失,没有错误(没有报告给airbrake.io).
有没有人有这方面的经验?
我的基础架构中有一个Resque服务器的"集群".它们都具有相同的确切工作优先级等.我根据有多少待处理作业以及服务器上用于处理所述作业的可用资源,自动扩展Resque服务器的数量.我总是至少有两个Resque服务器.
我的问题是,当我快速完成一项工作时,有时两台服务器都会处理这项工作.这是不好的.
我尝试使用以下内容为我的工作添加锁定:
require 'resque-lock-timeout'
class ExampleJob
extend Resque::Plugins::LockTimeout
def self.perform
# some code
end
end
Run Code Online (Sandbox Code Playgroud)
此插件适用于较长时间运行的作业.然而,对于这些超级微小的一次性工作,处理立即发生.Resque服务器都看不到其姐妹服务器设置的锁,既设置了锁,又处理了作业,解锁并完成了.
我不完全确定在这一点上做什么或者有什么解决方案除了让一个专用服务器处理这种类型的工作.这将是一个严重的配置和扩展的痛苦.我真的希望两个服务器都能够处理它,但是一旦其中一个服务器从队列中抓取它,确保另一个服务器不运行它.
任何人都可以提出一些可行的解决方案吗?
我正在尝试将Resque队列转换为Sidekiq.我已经完成了Sidekiq的整个设置,现在我已准备好将所有resque作业添加到sidekiq.
我的问题是:我可以简单地将redis中的所有resque密钥重命名为相应的sidekiq密钥吗?
例如,如果我有一个名为"twitter"的队列,则resque的redis键是"resque:queue:twitter",但sidekiq中的键是"queue:twitter".我可以简单地将"resque:queue:twitter"重命名为"queue:twitter"吗?
我需要一个用于大型动态任务集合的调度程序.目前我正在寻找resque-scheduler,rufus-scheduler和clockwork.我将非常感谢您选择使用哪一个(或替代方案).
一些细节:
总而言之,我需要像Ruby项目那样的cron,它可以处理大量动态变化的任务集合.
更新:我花了一天时间尝试调度库,现在我想简要总结一下新获得的经验.
我已经停止了对Clockwork和resque-scheduler库的关注,因为这些是更成熟的项目,有更详细的文档.Resque-scheduler基于rufus-scheduler,而Clockwork受其启发,两者都可以用于我正在寻找的解决方案.
两者都是应该在单独进程中运行的独立服务,可以处理为单个或经常执行而安排的几乎无限量的任务.任务在线程内执行.
发条专业人士:
发条缺点:
我已经为Clockwork实现了一个替代的Manager类(这是控制调度的gem的核心部分),以允许通过ZeroMQ消息进行调度控制.因此,我的项目中的主要服务可以向调度程序发送命令,例如"每天运行"或"取消调度任务#10",并且调度程序立即执行每个请求.
我对resque-scheduler的经验较少,但此时它似乎是一个更好的解决方案.
resque-scheduler专业人士:
Resque.remove_schedule(name)以删除特定任务.resque调度:
仔细观察后可能会出现其他东西,但目前还没有别的东西.
这就是我现在拥有的.顺便说一下,我在GitHub上发布了许多与调度相关的Ruby gem的链接.
resque ×10
ruby ×4
redis ×3
sidekiq ×2
cron ×1
database ×1
file-upload ×1
mysql ×1
scheduling ×1
unicorn ×1