从本地到部署环境的Sidekiq配置疑问:任务未执行等问题
Sidekiq + Redis 部署配置与任务执行问题排查
一、Redis 自动运行配置(纳入部署与服务器启动流程)
不管是包管理器安装还是源码编译的Redis,都可以通过系统服务(以systemd为例,主流Linux发行版通用)实现开机自启:
- 包管理器安装的Redis(如apt/yum):
直接启用并启动系统服务即可,部署时加到脚本里:sudo systemctl enable redis-server sudo systemctl start redis-server - 源码编译安装的Redis:
手动创建systemd服务文件/etc/systemd/system/redis.service,内容如下(按需替换路径):
然后执行:[Unit] Description=Redis In-Memory Data Store After=network.target [Service] User=redis Group=redis ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf ExecStop=/usr/local/bin/redis-cli shutdown Restart=always [Install] WantedBy=multi-user.target
部署流程中,将上述启用、启动命令加入部署脚本(如Capistrano的deploy任务)即可。sudo systemctl daemon-reload sudo systemctl enable redis sudo systemctl start redis
二、Sidekiq 自动运行配置(纳入部署与服务器启动流程)
同样用systemd管理Sidekiq进程,实现开机自启和部署后自动重启:
- 创建Sidekiq的systemd服务文件
/etc/systemd/system/sidekiq.service,替换其中的用户、应用路径、环境变量为你的实际信息:[Unit] Description=Sidekiq Background Worker After=network.target redis-server.target [Service] Type=simple User=deploy Group=deploy WorkingDirectory=/var/www/your-rails-app/current Environment="RAILS_ENV=production" ExecStart=/bin/bash -lc 'bundle exec sidekiq -q critical -q high -q default -q low' Restart=always SyslogIdentifier=sidekiq [Install] WantedBy=multi-user.target - 启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable sidekiq sudo systemctl start sidekiq - 部署流程中,每次发布代码后需要重启Sidekiq加载新代码,比如在Capistrano中添加:
或者手动执行:after 'deploy:published', 'sidekiq:restart'sudo systemctl restart sidekiq
三、任务队列未执行的排查与优先级规则
排查步骤
如果GenerateCodeJob进入default队列但长期未执行,按以下顺序排查:
- 确认Redis服务正常:执行
redis-cli ping,返回PONG说明连接正常; - 确认Sidekiq服务运行状态:执行
sudo systemctl status sidekiq,查看日志是否有Redis连接失败、代码报错等信息; - 检查Sidekiq是否监听default队列:打开Sidekiq控制面板的Queues页面,确认default队列对应的Processed数是否有变化,若没有,说明Sidekiq进程未正确监听该队列(可能是启动命令有误,或服务未重启加载新配置);
- 确认ActiveJob适配器配置:在
config/application.rb中确保设置了Sidekiq作为适配器:config.active_job.queue_adapter = :sidekiq
优先级与执行时序规则
Sidekiq的队列优先级完全由启动命令中队列的顺序决定:
- 启动命令中排在前面的队列优先级更高,比如你用的
-q critical -q high -q default -q low,Sidekiq会优先处理critical队列的所有任务,直到该队列为空,才会处理high队列,以此类推; - 如果default队列有任务但未执行,先检查critical、high队列是否有持续运行的任务占用Sidekiq进程;若高优先级队列为空,再排查Redis连接、Sidekiq服务状态或任务本身的代码错误(可查看Sidekiq控制面板的Retries/Dead页面,是否有失败任务)。
内容的提问来源于stack exchange,提问作者Jerome
相关产品推荐
相关产品推荐

