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

文章目录

    早上查看 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 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式