标签: resque

resque-scheduler和重叠的crons

我刚刚启动并运行resque-schedule,它可以正常运行一个计划任务.但是,当我在相同的cron时间表上添加第二个时,似乎它正在踩踏自己.这是我的resque_schedule.yml的样子:

email_subscription_notification:
  cron: * * * * *
  class: SubscriptionProcessor
  args: test
  description: Email Notifications
email_polling:
  cron: * * * * *
  class: EmailPollingProcessor
  args: test
  description: Email Polling
Run Code Online (Sandbox Code Playgroud)

当我通过rake resque:scheduler运行时,我会得到定期错误:

2011-03-15 17:43:00 Failed to enqueue EmailPollingProcessor:
  Got '0' as initial reply byte. If you're running in a multi-threaded environment, make sure you pass the :thread_safe option when initializing the connection. If you're in a forking environment, such as Unicorn, you need to connect to Redis after forking. 
Run Code Online (Sandbox Code Playgroud)

如果我将时间表更改为只有一个或另一个,他们会很好地发挥作用.如果我将cron计划更改为不重叠,它们运行正常.感谢您的任何帮助.OSx 10.6.6,Ruby …

resque ruby-on-rails-3

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

多个服务器上的resque worker

由于背景过程繁重,我们需要多个服务器才能进行后台处理.我们正在使用resque来处理后台工作.由于每台服务器上的resque工作人员将执行类似的任务,最好的方法是什么?

  1. 在每台机器上启动工作程序,每个处理所有队列.
  2. 将每个服务器上的工作队列之间的队列分开,以便一台服务器上的工作人员负责处理一半队列,而下一个队列中的工作人员负责处理其余队列.

我喜欢第一个解决方案.但这有什么限制吗?

谢谢.

ruby background resque ruby-on-rails-3

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

从resque中的redis队列中删除重复条目

我正在使用Resque,我有一个Redis队列.它有一些重复的条目.我需要删除重复的entires.如何删除这些重复的条目?我正在列入某个对象的id.

ruby resque redis

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

使用 Resque 排队进行集成测试或模拟?

你将如何测试这门课?您会将其与 Resque 集成并检查作业是否已放入队列中,或者您会模拟它吗?如果您要模拟它,您将如何避免重复示例规范中所示的代码。

class BookingReminderEnqueuer
  def initialize(user, booking, worker = BookingReminder)
    @user, @booking, @worker = user, booking, worker
  end

  def enqueue
    Resque.enqueue_at(
      remind_user_at,
      @worker,
      booking_id: @booking.id,
      user_id: @user.id
    ) if @booking.remind_user?
  end

  private
  def remind_user_at
    @booking.start_time - 6.hours
  end
end

require 'spec_helper'
describe BookingReminderEnqueuer
  describe "#enqueue" do
    context "when the user should have a reminder" do
      it "enqueues the reminder" do
        booking.stub(:remind_user?) { true }
        Resque.should_receive(:enqueue_at).with(
          booking.start_time - 6.hours,
          BookingReminder,
          booking_id: booking.id,
          user_id: user.id
        ).once
        booking_reminder_enqueuer.enqueue
      end
    end

    context "when …
Run Code Online (Sandbox Code Playgroud)

ruby integration-testing rspec mocking resque

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

在启动开发服务器的同时启动resque工作人员

我想在启动开发服务器时启动我的工作人员来测试 resque 调度程序中的新 cron 作业,因此我在启动开发服务器时运行此命令 -

QUEUE=* rake environment resque:work rails s
Run Code Online (Sandbox Code Playgroud)

它以前对我有用,如果我正确阅读他们的文档,它应该仍然有效。

但在挂断后中断它后,我收到以下错误 -

^Crake aborted!
Don't know how to build task 'rails'
Run Code Online (Sandbox Code Playgroud)

这是键盘中断并运行后得到的结果--trace

** Invoke environment (first_time)
** Execute environment
** Invoke resque:work (first_time)
** Invoke resque:preload (first_time)
** Invoke resque:setup (first_time)
** Invoke environment
** Execute resque:setup
** Execute resque:preload
** Invoke resque:setup
** Execute resque:work
^Crake aborted!
Don't know how to build task 'rails'
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我会收到错误,另外为什么它以前加载并工作但现在不再加载了。我在这里缺少什么?

ruby-on-rails resque redis

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

如何检查Resque中最后一个失败的作业?

我知道它返回一个哈希,但它的语法如何变得奇怪......我试图找出最后一个是什么.

如果我这样做:

Resque.info[:failed] # -> 68
Run Code Online (Sandbox Code Playgroud)

假设有68个失败的工作,当我这样做时:

Resque::Failure.all()
Run Code Online (Sandbox Code Playgroud)

它只返回一份工作(我相信它是第一份工作).

我认为这只是我的一个语法错误.因为我也看到了这个:

Resque::Failure.all(0, 20)
Run Code Online (Sandbox Code Playgroud)

我认为这将拉动0到20之间的一系列指数.

那么..有谁知道拉动最后一个失败的工作的语法条款?

ruby-on-rails resque

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

uninitialized constant Resque :: Helpers启动rails服务器时

尝试通过以下方式启动rails应用程序时出错rails s:

/Users/nils/.rvm/gems/ruby-1.9.3-p429/gems/resque-scheduler-2.0.1/lib/resque/scheduler.rb:9:in `<class:Scheduler>': uninitialized constant Resque::Helpers (NameError)
    from /Users/nils/.rvm/gems/ruby-1.9.3-p429/gems/resque-scheduler-2.0.1/lib/resque/scheduler.rb:7:in `<module:Resque>'
    from /Users/nils/.rvm/gems/ruby-1.9.3-p429/gems/resque-scheduler-2.0.1/lib/resque/scheduler.rb:5:in `<top (required)>'
    from /Users/nils/.rvm/gems/ruby-1.9.3-p429@global/gems/bundler-1.3.5/lib/bundler/runtime.rb:81:in `require'
    from /Users/nils/.rvm/gems/ruby-1.9.3-p429@global/gems/bundler-1.3.5/lib/bundler/runtime.rb:81:in `rescue in block in require'
    from /Users/nils/.rvm/gems/ruby-1.9.3-p429@global/gems/bundler-1.3.5/lib/bundler/runtime.rb:66:in `block in require'
    from /Users/nils/.rvm/gems/ruby-1.9.3-p429@global/gems/bundler-1.3.5/lib/bundler/runtime.rb:59:in `each'
    from /Users/nils/.rvm/gems/ruby-1.9.3-p429@global/gems/bundler-1.3.5/lib/bundler/runtime.rb:59:in `require'
    from /Users/nils/.rvm/gems/ruby-1.9.3-p429@global/gems/bundler-1.3.5/lib/bundler.rb:132:in `require'
    from /Users/nils/Uni/Masterarbeit/TweetTracker/config/application.rb:7:in `<top (required)>'
    from /Users/nils/.rvm/gems/ruby-1.9.3-p429/gems/railties-4.0.0/lib/rails/commands.rb:76:in `require'
    from /Users/nils/.rvm/gems/ruby-1.9.3-p429/gems/railties-4.0.0/lib/rails/commands.rb:76:in `block in <top (required)>'
    from /Users/nils/.rvm/gems/ruby-1.9.3-p429/gems/railties-4.0.0/lib/rails/commands.rb:73:in `tap'
    from /Users/nils/.rvm/gems/ruby-1.9.3-p429/gems/railties-4.0.0/lib/rails/commands.rb:73:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>'
Run Code Online (Sandbox Code Playgroud)

我在Ruby 1.9.3中使用Rails 4.在我的Gemfile中:

gem 'resque', "~> 2.0.0.pre.1", github: "resque/resque"
gem 'resque-scheduler'
Run Code Online (Sandbox Code Playgroud)

和相应的初始化程序:

# …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails resque

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

如何为 ActiveRecord 模型对象查找关联的 Resque 作业?

我需要能够找到模型对象的排队和/或工作作业和/或失败的作业,例如,当模型对象被销毁时,我们想要找到所有并决定不删除或销毁作业(有条件地) .

在我重新发明轮子之前,是否有推荐的方法来做到这一点?

例子:

如果您想创建一个before_destroy回调,当对象被销毁(排队和失败的作业)时销毁所有作业,并且仅在没有工作作业时销毁

我想为这个示例用例做的一些伪代码:

报表模型

class Report < ActiveRecord::Base
  before_destroy :check_if_working_jobs, :destroy_queued_and_failed_jobs

  def check_if_working_jobs
    # find all working jobs related to this report object
    working_jobs = ProcessReportWorker.find_working_jobs_by_report_id(self.id) 
    return false unless working_jobs.empty?
  end

  def destroy_queued_and_failed_jobs
    # find all jobs related to this report object
    queued_jobs = ProcessReportWorker.find_queued_jobs_by_report_id(self.id) 
    failed_jobs = ProcessReportWorker.find_failed_jobs_by_report_id(self.id) 

    # destroy/remove all jobs found
    (queued_jobs + failed_jobs).each do |job| 
       # destroy the job here ... commands?
    end

  end
end
Run Code Online (Sandbox Code Playgroud)

用于 resque / redis 支持的作业的报告处理工作类

class ProcessReportWorker …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails resque redis

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

如何使用 systemd 管理一组 resque 工人?

我正在尝试将一组 resque 工人的控制权从暴发户迁移到 systemd。在 upstart 下,我们可以有两个控制脚本,一个脚本定义单个 worker,第二个脚本多次调用第一个脚本以使用单个 upstart 命令启动或停止多个 worker。我们正在尝试使用 systemd 实现相同的功能。

我试过每个工人使用一个 systemd 单元,所以如果我们尝试管理 6 个工人,我们使用 6 个单独的 systemd 单元脚本,每个工人一个。然后我们使用一个 bash 脚本来触发:

systemctl start|stop|restart worker-1.service &
systemctl start|stop|restart worker-2.service &
...
Run Code Online (Sandbox Code Playgroud)

问题是当我们通过 systemctl 发送终止信号时,它会立即终止父 resque 进程,导致任何分叉的子进程立即死亡,而不是在死亡之前完成他们的工作。我们能够使用 upstart 来实现这种确切的行为,其中父进程不会接受新工作(将停止分叉),并且在工作完成子工作进程后,允许子工作进程在工作时保持活动状态自行死亡。

在 systemd 下,工作人员都会立即死亡,工作在中途终止,然后才能完成。

我们的 systemd 单元脚本如下所示:

[Unit]
Description=Controls a single Resque worker process: worker-1
After=redis.service

[Service]
Restart=on-failure
RestartSec=10
StartLimitInterval=400
StartLimitBurst=5
KillSignal=SIGQUIT

User=www-data
WorkingDirectory=/app/working/dir
Type=single
ExecStart=/usr/bin/bundle exec rake production resque:work QUEUE=a,b,c,d,e,f
ExecStop=/bin/kill -QUIT $MAINPID

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

我已经尝试将 Type=single 更改为 Type=forking,但是该进程并没有保持不变,它会尝试启动,然后当没有可用的工作时,因为父进程仅在有工作时分叉,所以该进程死亡并且无法熬夜。使用 Type=simple,流程按预期工作,但如上所述,我们无法像使用 upstart …

ruby-on-rails upstart resque systemd ubuntu-18.04

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

Multiple无法从客户端接收数据:通过对等Postgresql和Resque重置连接

我有一个运行Postgresql的服务器.在日志中我看到这个消息为我的resque基于'工人'框,每分钟多次.几分钟没有消息,其他可能是10次.

2016-01-12 13:40:36 EST:1.1.8.2(33899):[16141]: LOG:  could not receive data from client: Connection reset by peer
Run Code Online (Sandbox Code Playgroud)

现在,当我进入1.1.8.2框中观察netstat -ntp我没有看到端口33899,并且其中大部分至少在40xxx范围内.这可能是猜想,但我不知道为什么Redis/Resque/Puma Rails堆栈会打印出这些消息,更不用说这意味着即使我到底了.

如果它们"正常"关闭,我会获回记忆吗?

这是一件值得警惕的事吗?

当数据库框和工作框都不再显示端口时,如何调试打开的OLD端口?

postgresql resque puma

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