多API项目Sidekiq服务端执行错误API代码问题咨询
Sidekiq任务执行逻辑与问题修复方案
一、Sidekiq Server任务执行逻辑
- Sidekiq Server进程启动时会完整加载当前运行环境的Rails项目代码,之后连接配置指定的Redis实例,监听对应命名空间下的任务队列。
- 当从Redis中拉取到任务时,Sidekiq会直接在当前已加载的代码环境中匹配任务指定的Worker类,调用其
perform方法执行逻辑。 - Redis命名空间的作用仅为隔离不同业务的任务存储,不会自动关联对应项目的代码环境,代码环境完全由Sidekiq进程启动时加载的代码库决定。
二、现有配置的错误点
你当前的问题核心是两个Sidekiq进程加载的是同一份代码,和namespace配置无关:
- 查看
docker-compose.yml中两个Sidekiq服务的配置,build字段均为当前目录、volumes也均挂载当前目录代码,意味着sidekiq_ignite和sidekiq_super_admin两个进程加载的是完全相同的代码,只会有其中一个项目的Worker类定义,另一个项目的任务执行时自然找不到对应常量。 - 额外小问题:你API服务配置的
REDIS_URL_SIDEKIQ中db段用了字符串(/ignite、/super_admin),而Redis的数据库为数字索引(默认支持0-15),非数字的db值会被解析为默认的0,可能导致不必要的存储冲突。
三、修复方案
1. 修正Sidekiq服务的构建与挂载配置
让两个Sidekiq进程分别加载对应API项目的代码,修改docker-compose.yml中Sidekiq相关配置如下:
sidekiq_ignite: depends_on: - db - redis build: ../ccp-ignite-api-gmv/. # 改为Ignite API的代码路径 command: bundle exec sidekiq volumes: - ../ccp-ignite-api-gmv/.:/src # 挂载Ignite API代码 environment: - REDIS_URL_SIDEKIQ=redis://redis:6379/1 # 改为数字db - REDIS_NAMESPACE_SIDEKIQ=ignite sidekiq_super_admin: depends_on: - db - redis build: ../ccp-super-admin-api-gmv/. # 改为超级管理员API的代码路径 command: bundle exec sidekiq volumes: - ../ccp-super-admin-api-gmv/.:/src # 挂载超级管理员API代码 environment: - REDIS_URL_SIDEKIQ=redis://redis:6379/2 # 改为不同的数字db - REDIS_NAMESPACE_SIDEKIQ=super_admin
2. 同步API服务的Redis配置
将两个API服务的REDIS_URL_SIDEKIQ也改为对应数字db,和Sidekiq侧配置保持一致即可。
内容的提问来源于stack exchange,提问作者Khoa Thai
相关产品推荐
相关产品推荐

