如何在Ubuntu上运行sidekiq作为守护进程?
如果我跑,bundle exec sidekiq -D
我得到invalid option: -D
,有没有办法运行它没有其他控制器,如上帝,新贵...?
有没有办法禁用ActiveJob和Sidekiq的自动重试?
我知道只有Sidekiq,我们只需要放
sidekiq_options :retry => false
Run Code Online (Sandbox Code Playgroud)
如上所述:https://github.com/mperham/sidekiq/wiki/Error-Handling#configuration
但它似乎不适用于ActiveJob和Sidekiq.
我也知道这里提出的重新启用重试的解决方案:https://stackoverflow.com/a/28216822/2431728
但这不是我需要的行为.
从Rails API,我发现ActiveJob可以retry_job间隔:
my_job_instance.enqueue
my_job_instance.enqueue wait: 5.minutes
my_job_instance.enqueue queue: :important
my_job_instance.enqueue wait_until: Date.tomorrow.midnight
Run Code Online (Sandbox Code Playgroud)
但是如果我想设置重试计数,比如Sidekiq:
include Sidekiq::Worker
sidekiq_options :retry => 5
Run Code Online (Sandbox Code Playgroud)
该示例代码怎么办?
class SiteScrapperJob < ActiveJob::Base
rescue_from(ErrorLoadingSite) do
retry_job queue: :low_priority
end
def perform(*args)
# raise ErrorLoadingSite if cannot scrape
end
end
Run Code Online (Sandbox Code Playgroud)
现在我把它添加到我的工作班:
Sidekiq.default_worker_options = { retry: 5 }
Run Code Online (Sandbox Code Playgroud)
但似乎不是很好.
在用户首次登录后,我正在使用Sidekiq工作人员完成对Facebook的一些请求.通常,任务大约需要20秒左右.
我想在同步完成后立即使用ajax请求将一些信息加载到页面上,但我不确定使用Javascript检查作业完成的最佳方法.
一种可能性是配置Sidekiq工作程序在其余作业完成后设置cookie.然后我可以使用setTimeout函数在调用load函数之前继续检查cookie.但我不确定这是否是最佳方式.我可以使用Redis吗?
我的Rails 4.1应用程序使用Sidekiq在Celluloid actor中运行测量.它不断耗尽数据库连接.似乎Sidekiq每个作业打开2个连接,旧连接永远不会正常关闭.
MeasurementWorker
.通过电话MeasurementWorker.perform_async(measurement.id)
.它这样做: class MeasurementWorker
include Sidekiq::Worker
sidekiq_options retry: false, backtrace: true
def perform(measurement_id, force = false)
ActiveRecord::Base.connection_pool.with_connection do
Measurement.find(measurement_id).run
end
end
end
Run Code Online (Sandbox Code Playgroud)
.run
,它会这样做: # various checks if measurement can be run at all, using AR
# ...
begin
ActiveRecord::Base.connection_pool.with_connection do
# (I used to have a Timeout.timeout here, but removed it for the
# sake of simplification)
@connection = MeasurementConnection.new do |event_info|
event = Event.new
event.assign_attributes(event_info)
event.save
end
while @connection.measuring?; end …
Run Code Online (Sandbox Code Playgroud) 重启sidekiq的正确方法是什么?它似乎在我启动它时缓存我的工作人员代码,因此每次我对我的工作人员进行更改时我都需要重新启动它.我正在使用Ctrl/C执行此操作,但此过程需要很长时间才能结束并将我返回到提示符.
有没有办法迫使重启立即生效?
我正在使用最新版本的Sinatra通过POW运行.
我使用Sidekiq作为我的后台工作:
我有一个工人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
Run Code Online (Sandbox Code Playgroud)
从文件lib/parse_excel.rb调用
def parse_raw_data
#job_id and #filename are defined bfr
DataImportWorker.perform_async(job_id,filename)
end
Run Code Online (Sandbox Code Playgroud)
一旦我从我的行动中触发它,工作人员就不会被调用.Redis正在运行 localhost:6379
知道为什么这一定必须发生.环境是Linux.
我已经查看了多个来源并尝试了各种方案,但无法解决这个问题.请指出我正确的方向.
像每个人一样,我有3个环境(开发,分期和生产).
我在sidekiq.yml文件中有以下内容
# Options here can still be overridden by cmd line args.
# sidekiq -C config.yml
---
:verbose: false
:namespace: xyz
:logfile: log/sidekiq.log
:concurrency: 25
:strict: false
:pidfile: tmp/pids/sidekiq.pid
:queues:
- [stg_xyz_tests_queue, 10]
- [stg_default_xyz_queue, 2]
- [stg_xyz_default_queue, 3]
development:
:verbose: true
:concurrency: 15
:queues:
- [dev_xyz_queue, 10]
- [dev_default_xyz_queue, 2]
- [dev_xyz_default_queue, 3]
staging:
:queues:
- [stg_xyz_queue, 10]
- [stg_default_xyz_queue, 2]
- [stg_xyz_default_queue, 3]
production:
:queues:
- [prod_xyz_queue, 10]
- [prod_default_xyz_queue, 2]
- [prod_xyz_default_queue, 3]
Run Code Online (Sandbox Code Playgroud)
有了这个,我希望当我用命令启动sidekiq时
RAILS_ENV=#{rails_env} …
Run Code Online (Sandbox Code Playgroud) 我有Unicorn,Sidekiq和Postgres设置.
我试图了解正确的配置设置,以便我没有达到最大数据库连接限制.在Opsworks中,m1.small Postgres RDS实例最多可以有121个连接.
我的db池大小为5.
考虑一下.Sidekiq和Unicorn是它自己的过程.因此,每个进程的数据库池大小为5.如果我的理解错误,请纠正我.
如果我有5个独角兽进程',那意味着5*5 = 25个数据库连接
现在这是我有点困惑的部分,因为Sidekiq是多线程的.如果Sidekiq的并发度为5.并且db池大小也设置为5.这是否意味着在给定时间内有25个潜在的数据库连接?
这意味着,对于一个实例,我可以有50个db连接?
我正在尝试记录我的sideqik工作者tail -f log/development.log
在开发和heroku logs
生产中使用的进度.
但是,工作人员内部的所有内容以及工作人员调用的所有内容都不会被记录.在下面的代码中,只记录了TEST 1.
如何记录worker中的所有内容以及worker调用的类?
# app/controllers/TasksController.rb
def import_data
Rails.logger.info "TEST 1" # shows up in development.log
DataImportWorker.perform_async
render "done"
end
# app/workers/DataImportWorker.rb
class DataImportWorker
include Sidekiq::Worker
def perform
Rails.logger.info "TEST 2" # does not show up in development.log
importer = Importer.new
importer.import_data
end
end
# app/controllers/services/Importer.rb
class Importer
def import_data
Rails.logger.info "TEST 3" # does not show up in development.log
end
end
Run Code Online (Sandbox Code Playgroud)
更新
我仍然不明白为什么Rails.logger.info
或Sidekiq.logger.info
不登录日志流.通过替换来实现Rails.logger.info
它puts
.