如何在运行时检测Rails应用是否运行在Sidekiq Worker上下文
Rails 初始化器中检测Sidekiq运行上下文的方案
不需要额外传入环境变量即可实现上下文判断,常用的两种实现方案如下:
- 基础判断方案(无侵入,适合绝大多数场景)
Sidekiq 服务端进程启动时会自动加载Sidekiq::Server常量,普通 Rails Web 进程、Rake 任务进程不会加载该常量,直接判断常量是否存在即可:
# 写在 Rails 初始化器文件中即可 if defined?(Sidekiq::Server) # 仅在Sidekiq场景下执行的代码 end
- 增强兼容方案(避免特殊场景误判)
如果你的项目存在其他场景可能误加载Sidekiq::Server的情况,可以结合Ruby当前运行脚本名做双重校验:
is_sidekiq_context = defined?(Sidekiq::Server) || $0.include?('sidekiq') if is_sidekiq_context # 仅在Sidekiq场景下执行的代码 end
注意:不要直接用
defined?(Sidekiq)做判断,只要Gemfile中引入了Sidekiq gem,所有Rails进程都会加载Sidekiq基础常量,该判断永远为真,无法区分运行上下文。
内容的提问来源于stack exchange,提问作者John Bachir
相关产品推荐
相关产品推荐

