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

更新日期: 2019-07-31 阅读次数: 5290 字数: 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 聊聊, 查看更多联系方式