You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从本地到部署环境的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
    
    然后执行:
    sudo systemctl daemon-reload
    sudo systemctl enable redis
    sudo systemctl start redis
    
    部署流程中,将上述启用、启动命令加入部署脚本(如Capistrano的deploy任务)即可。

二、Sidekiq 自动运行配置(纳入部署与服务器启动流程)

同样用systemd管理Sidekiq进程,实现开机自启和部署后自动重启:

  1. 创建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
    
  2. 启用并启动服务:
    sudo systemctl daemon-reload
    sudo systemctl enable sidekiq
    sudo systemctl start sidekiq
    
  3. 部署流程中,每次发布代码后需要重启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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:50:29