laravel mysql 锁表_Laravel 多进程数据库队列死锁分析及解决方案

问题描述

最近项目线上环境,队列服务器上一直频繁地大量出现数据库死锁问题,这个问题最早可以追溯到年前,19年的时候就出现了,当时一直频于开发业务功能,所以一直未去处理这个问题,这次正好来探究一下死锁的原因和问题所在。

首先,目前项目中使用的队列驱动选用的是database,因为简单、高效、无需扩展其他第三方应用,就一直采用了mysql数据库来作为队列驱动,线上队列环境运行的是:Ubuntu 16.04 + Mysql5.7 + Laravel5.6,这样的一个配置,目前整体使用supervisor在上面托管了16个队列进程。

94d1c069b9fd0c7d26ff7e72fa17dc82.png

上图显示了17个,因为有一个匹配符,所以需要-1,就是16个。

查看死锁日志

d2e5584973f9c0c58cb4395ff14731a1.png

异常监控

laravel mysql 锁表_Laravel 多进程数据库队列死锁分析及解决方案_第1张图片

这个死锁问题,接近触发了44万次事件,几乎每分每秒都有几率触发死锁,看了下队列源码发现是X锁造成的,然后下面就尝试模拟一下多进程队列消费,是否会造成死锁出现。

多进程消费队列

生成一个测试Job

你可能感兴趣的:(laravel,mysql,锁表)