早上查看 laravel 任务队列的运行状况时,发现剩余一条 job,一直没有处理完。
然后,查看日志,发现在不断报错:
Numeric value out of range: 1264 Out of range value for column 'attempts' at row 1 (SQL: update
jobs
setreserved_at
= xx,attempts
= 256 wh ereid
= xx)
感觉是 attempts 字段类型问题,于是查看了一些 jobs 表的建表语句
| jobs | CREATE TABLE `jobs` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`queue` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`payload` longtext COLLATE utf8_unicode_ci NOT NULL,
`attempts` tinyint(3) unsigned NOT NULL,
`reserved_at` int(10) unsigned DEFAULT NULL,
`available_at` int(10) unsigned NOT NULL,
`created_at` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `jobs_queue_reserved_at_index` (`queue`,`reserved_at`)
) ENGINE=InnoDB AUTO_INCREMENT=11542 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
attempts: 255 正好到了数值的上限。
将 attempts 设置为 1 解决:
update jobs set attempts = 1;
但这只是临时解决方案,并没有从根本上解决问题。
解决问题的根本方法
还是需要能够考虑到各种异常情况。
例如,今天遇到的这个问题的根本问题,在于客户使用多套会员系统,传递过来的 user id 存在重复的可能,而我在本方服务的数据表中对 user id 做了唯一索引。所以,导致一旦两个系统的会员 id 相同,我这里就会无限报唯一键冲突的异常,最终导致 attemps 次数超过限制。
把唯一索引去掉,增加会员系统编号,将异常情况解决,才是处理 laravel 队列问题的根本。
微信关注我哦 👍
我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式