标签: resque

使用Resque记录问题

我已将Resque添加到我的Rails 3项目中.我创建了一个从DB读取/写入一些内容的作业.

问题是我没有看到SQL查询日志,例如"Post Load(0.5ms)SELECT"在终端中发布".*FROM"posts""了.我也没有看到我设置的任何Rails.logger消息.

当我再做一个请求(简单刷新)时,记录器消息和SQL查询日志突然出现.

什么想法可能会发生什么?谢谢

resque ruby-on-rails-3

6
推荐指数
1
解决办法
6580
查看次数

将上传的文件发送给resque worker进行处理

我刚刚开始使用resque在后台对一些非常大的文件进行处理,而我却无法弄清楚如何将文件传递给resque worker.我使用rails来处理文件上传,rails ActionDispatch::Http::UploadedFile为从表单上传的每个文件创建一个对象.

如何将此文件发送给resque工作者?我尝试发送一个只有临时文件的路径名和原始文件名的自定义哈希,但我不能再重新打开resque worker中的临时文件(只是正常Errno::ENOENT - No such file or directory),因为rails似乎在请求结束后删除了该临时文件.

file-upload ruby-on-rails resque

6
推荐指数
2
解决办法
1981
查看次数

多个resque worker模式创建额外的进程

我需要启动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 …

resque

6
推荐指数
1
解决办法
4063
查看次数

保护redis db有哪些选择?

我在本地运行Redis并且有多台机器在同一个端口上与redis通信 - 是否有关于锁定Redis访问权限的好方法的建议?数据库在Mac OS X上运行.谢谢.

编辑:这是假设我不想在配置中使用内置(非向后兼容)Redis requirepass指令.

ruby resque redis

6
推荐指数
1
解决办法
1023
查看次数

如何使用Resque在父级和子级之间共享MySQL连接?

默认情况下,Resque中的父进程分支和子进程会创建与数据库的新连接.

这可以工作,但如果你有几十个工人,MySQL就无法保持打开很多连接并开始抛出错误.

让孩子们使用他们父母的MySQL连接的解决方案是什么?

ruby mysql database ruby-on-rails resque

6
推荐指数
1
解决办法
936
查看次数

Resque没有获取Redis配置设置

我试图获得在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)

.

ruby-on-rails unicorn resque redis

6
推荐指数
2
解决办法
1万
查看次数

长期运行的Sidekiq工作一直在濒临死亡

我正在使用sidekiq gem来处理Rails中的后台作业.出于某种原因,这项工作在一段时间后就会挂起 - 这个过程要么变得反应迟钝,要么出现top但没有多少,或者神秘地消失,没有错误(没有报告给airbrake.io).

有没有人有这方面的经验?

ruby-on-rails background-process resque sidekiq

6
推荐指数
1
解决办法
2597
查看次数

如何将Resque作业锁定到一台服务器

我的基础架构中有一个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服务器都看不到其姐妹服务器设置的锁,既设置了锁,又处理了作业,解锁并完成了.

我不完全确定在这一点上做什么或者有什么解决方案除了让一个专用服务器处理这种类型的工作.这将是一个严重的配置和扩展的痛苦.我真的希望两个服务器都能够处理它,但是一旦其中一个服务器从队列中抓取它,确保另一个服务器不运行它.

任何人都可以提出一些可行的解决方案吗?

ruby ruby-on-rails resque redis

6
推荐指数
1
解决办法
1171
查看次数

将Resque队列转换为SideKiq

我正在尝试将Resque队列转换为Sidekiq.我已经完成了Sidekiq的整个设置,现在我已准备好将所有resque作业添加到sidekiq.

我的问题是:我可以简单地将redis中的所有resque密钥重命名为相应的sidekiq密钥吗?

例如,如果我有一个名为"twitter"的队列,则resque的redis键是"resque:queue:twitter",但sidekiq中的键是"queue:twitter".我可以简单地将"resque:queue:twitter"重命名为"queue:twitter"吗?

ruby-on-rails resque sidekiq

6
推荐指数
1
解决办法
975
查看次数

Ruby中的大规模调度

我需要一个用于大型动态任务集合的调度程序.目前我正在寻找resque-scheduler,rufus-schedulerclockwork.我将非常感谢您选择使用哪一个(或替代方案).

一些细节:

  • 有大量任务(最多100K)要定期执行.
  • 最短的执行期是1小时.
  • 新任务可能会不时出现.可以更改或删除现有任务.
  • 调度延迟最小化在这里不是关键任务(可扩展性和可持续性是最重要的).
  • 任务执行不是繁重的操作,并且可以轻松并行.

总而言之,我需要像Ruby项目那样的cron,它可以处理大量动态变化的任务集合.

更新:我花了一天时间尝试调度库,现在我想简要总结一下新获得的经验.

我已经停止了对Clockwork和resque-scheduler库的关注,因为这些是更成熟的项目,有更详细的文档.Resque-scheduler基于rufus-scheduler,而Clockwork受其启发,两者都可以用于我正在寻找的解决方案.

两者都是应该在单独进程中运行的独立服务,可以处理为单个或经常执行而安排的几乎无限量的任务.任务在线程内执行.

发条专业人士:

  • 它能够从数据库(通过ActiveRecord或任意源)加载计划任务.
  • 此外,它还可以通过轮询数据库中的数据更新来动态更新计划任务.

发条缺点:

  • 数据库轮询是一个潜在的瓶颈.
  • 轮询间隔为1分钟(加上重新安排所有任务的时间),这有点太慢了.
  • 解决(计划或更改)计划任务没有记录,这就是为什么使用此功能看起来像是一个黑客攻击我.

我已经为Clockwork实现了一个替代的Manager类(这是控制调度的gem的核心部分),以允许通过ZeroMQ消息进行调度控制.因此,我的项目中的主要服务可以向调度程序发送命令,例如"每天运行"或"取消调度任务#10",并且调度程序立即执行每个请求.

我对resque-scheduler的经验较少,但此时它似乎是一个更好的解决方案.

resque-scheduler专业人士:

  • 基于Redis的持久性.手册断言服务重启后可以挽救计划任务.
  • 使用干净API进行动态调度.您只需要调用Resque.remove_schedule(name)以删除特定任务.
  • Web UI.不太重要,但很高兴.

resque调度:

  • 它需要安装Redis.

仔细观察后可能会出现其他东西,但目前还没有别的东西.

这就是我现在拥有的.顺便说一下,我在GitHub上发布了许多与调度相关的Ruby gem的链接.

ruby cron scheduling resque rufus-scheduler

6
推荐指数
1
解决办法
1994
查看次数