Rails生产环境中Delayed Job任务重复问题排查咨询
Delayed Job任务重复问题排查(Rails 5.2.5 + Ruby 2.6.3 + Cloud 66部署)
问题背景
我们的Rails应用(版本5.2.5,Ruby版本2.6.3)使用Delayed Job处理后台任务,通过Cloud 66部署。当Worker服务器(Delayed Job进程服务器)因死锁宕机后,已排队的Delayed Job记录出现重复——生成了约1000条Handler相同、创建时间一致的任务,但服务器宕机时并未出现任务重复。根据Delayed Job官方文档,理论上不会出现这类记录重复,需排查可能原因。
示例重复任务的Handler:
--- !ruby/object:Delayed::PerformableMethod object: !ruby/class 'SendNotificationJob' method_name: :perform_now args: - 11111
可能的原因
- 数据库事务提交异常:死锁导致Worker进程崩溃时,若任务入队操作处于未完成的事务中,数据库可能在进程终止后自动回滚,但Cloud 66部署架构下的数据库连接池异常回收,可能导致事务状态不一致,最终触发任务被重复写入。
- Worker重启时的任务重入逻辑错误:Cloud 66自动重启Delayed Job进程时,进程可能错误地将队列中"未确认完成"的排队任务重新生成,没有正确识别这些任务已存在于队列中,进而造成重复。
- 数据库隔离级别配置不当:若数据库使用读未提交等过低的隔离级别,Worker进程处理任务时,其他进程可能读取到未提交的任务记录,触发重复写入;死锁发生时,数据库锁机制异常也可能导致同一任务的入队请求被多次执行。
- Delayed Job版本兼容性bug:尽管官方文档说明不会出现重复,但特定版本的Delayed Job配合Rails 5.2.5和Ruby 2.6.3时,可能存在未被发现的bug,比如进程崩溃后的任务恢复逻辑错误复制了排队任务。
- Cloud 66进程管理的并发问题:Cloud 66重启Worker进程时,可能短时间内启动多个进程,这些进程同时读取队列状态,都判定某任务需要重新入队,最终导致重复创建。
内容的提问来源于stack exchange,提问作者Seenivasan
相关产品推荐
相关产品推荐

