我最近不得不对我的Sidekiq队列进行优先级排序(在我只使用default队列之前)。
因此,我编写了一些作业,这些作业应该在不同的队列上执行。
我的sidekiq.yml
:queues:
- slack_notifier
- invoicing
- default
deploy.rb (卡斯特拉诺):
# ...
set :sidekiq_config, "#{current_path}/config/sidekiq.yml"
# probably below line does same thing as above one
set :sidekiq_opt
在sidekiq维基上,它说我可以通过轮询来检查sidekiq的状态。我知道当我执行延迟方法sidekiq将返回进程id,但是如何检查Sidekiq以查看id是否已完成处理。
我希望看到一些类似下面这样的代码:
if Sidekiq.check_complete?(process_id)
puts 'Process completed'
end
我想在没有任何额外的宝石的情况下做到这一点。
我有一个sidekiq worker,它应该不会超过30秒,但几天后,我会发现整个worker队列停止执行,因为所有worker都被锁定。
这是我的工人:
class MyWorker
include Sidekiq::Worker
include Sidekiq::Status::Worker
sidekiq_options queue: :my_queue, retry: 5, timeout: 4.minutes
sidekiq_retry_in do |count|
5
end
sidekiq_retries_exhausted do |msg|
我有一个使用引擎的rails应用程序,其中定义了Sidekiq工人。worker的perform_async在引擎内的控制器中调用。worker的perform对通过该控制器传递的参数进行处理。worker类中也定义了特定于worker的队列。然而,当一个请求进入控制器时,它会被从“perform_async”推送到redis服务器的正确队列中。一个bundle exec sidekiq启动了Sidekiq。但是,工作者的perform永远不会被执行。检查sidekiq UI,我可以看到作业在正确的队列中。这是我的工人的样子
require 'pando'
class Pan
我在我的集群上使用kubernetes和几个rails / node docker镜像。它们中的大多数都有:3000/ health health check,它可以简单地在身体中返回状态为200的OK。
现在,我正在尝试发现如何在运行sidekiq的docker镜像上执行此健康检查的最佳方法。如何验证工作进程是否正在运行?
正如标题所述,我有3个容器在码头运行,一个用于rails,一个用于postgres db,一个用于redis。我可以在执行Job.perform_async的任务中排队,但由于某种原因,我的任务将无限期地停留在队列中。我检查过了,我的Redis容器已经启动并运行。
我的工作:
class HardJob
include Sidekiq::Job
def perform(*args)
puts 'HardJob'
end
end
sidekiq的初始化程序:
Sidekiq.configure_server do |config|
config.re
我正在使用进行后台工作:
我有一个worker app/workers/data_import_worker.rb
class DataImportWorker
include Sidekiq::Worker
sidekiq_options retry: false
def perform(job_id,file_name)
begin
#Some logic in it .....
end
end
从文件库/parse_excel.rb调用的
def parse_raw_data
#job_id and #filename are defin
我正在试图弄清楚如何能够访问后台作业的状态使用侧边机。
为了检查作业的状态,我检查队列的大小。
class PagesWorker
include Sidekiq::Worker
include Sidekiq::Status::Worker
sidekiq_options queue: "high"
def perform(ifile)
system "rake db:..."
# What do the following do? In what scenario would I need
我有一个带有2个作业的Rails应用程序(ImportCsvJob和ProcessCsvJob)。这样,我就可以在应用程序中明显地提示队列中还有作业,我有这个助手方法(在application_helper.rb中):
module ApplicationHelper
def queued_job_count
Sidekiq::Queue.new.size
end
end
然后,我在我的索引控制器上使用它,然后将它传递到视图中进行处理,并在应用程序中给出视觉提示。
def index
@still_have_jobs = !queued_job_cou
在我的rails应用程序中,我试图将视频上传到后台任务。我创建了一个Sidekiq工作人员,但需要在任务结束时呈现一个JSON响应(我以前在控制器中所做的)。例如,这就是当前控制器的样子:
# start sidekiq worker
VideoUploaderWorker.perform_async(video_info)
respond_to do |format|
if @video.save
# add thumbnail image id to video
@video.update_attributes(:i
这个非常小的脚本在执行后会冻结:
from multiprocessing import Queue
q = Queue()
for x in range(10000):
q.put("hello")
print "ok"
它正确地打印"ok“,但是没有完成,我必须手动终止这个过程。我检查了q.full()的输出,它总是返回False。如果我添加了第二个循环,将所有项从队列中取出,那么它将正确结束:
for x in range(10000):
q.get()
如果我把这个数字减少到1000,它也会正确地结束。那么这里有什么问题呢?是否存
我的Rails应用程序中有一个控制器操作,可以通过文本消息和电子邮件与用户联系。由于我不会详细介绍的原因,在成功发送电子邮件之前,需要完成文本消息。我最初有这样的东西:
控制器:
class MyController < ApplicationController
def contact_user
ContactUserWorker.perform_async(@user.id)
end
end
员工:
class ContactUserWorker
include Sidekiq::Worker
def perform(user_id)
SendUse
我正在开发一个在nginx负载均衡器后面有多个rails服务器的生产应用程序。我们正在使用monit监控sidekiq进程,它工作得很好--当sidekiq进程死掉时,monit会立即重新启动它。
然而,最近遇到了这样一种情况,其中一个进程正在运行,对monit可见,但由于某种原因,对sidekiq不可见。这导致了许多失败的作业,并花了我们一些时间来注意到我们在sidekiq Web UI中遗漏了一个进程,因为monit告诉我们一切都很好,所有的进程都在运行。简单的重新启动解决了这个问题。
这就引出了我的问题:你如何监控你的sidekiq进程?我知道我可以使用rollbar之类的工具在作业失败