Laravel 队列的 bug: Out of range value for column 'attempts'

更新日期: 2019-07-31 阅读次数: 806 字数: 385 分类: Laravel

早上查看 laravel 任务队列的运行状况时,发现剩余一条 job,一直没有处理完。

然后,查看日志,发现在不断报错:

Numeric value out of range: 1264 Out of range value for column 'attempts' at row 1 (SQL: update jobs set reserved_at = xx, attempts = 256 wh ere id = 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 聊聊。 白天工地搬砖,晚上哄熊孩子,可能回复有点慢,见谅。 查看更多联系方式

相关文章

爱评论不评论

近期节日

2019年12月07日 大雪
2019年12月09日 "一二九"运动纪念日
2019年12月09日 世界足球日
2019年12月10日 世界人权日
2019年12月12日 西安事变纪念日
2019年12月13日 南京大屠杀
2019年12月20日 澳门回归日
2019年12月21日 国际篮球日
2019年12月22日 冬至
2019年12月24日 平安夜
2019年12月25日 圣诞节
查看更多节日