问题

公司项目使用Laravel的开发的两个项目在同一个测试服务器部署,公用同一个redis。在使用laravel中的队列时,产生冲突干扰。
查找问题原因
在laravel 队列的操作类Illuminate\Queue\RedisQueue.php中可以看到pushRaw()方法:
// 将一任务推入队列中
public function pushRaw($payload, $queue = null, array $options = [])
{
$this->getConnection()->rpush($this->getQueue($queue), $payload);
return Arr::get(json_decode($payload, true), 'id');
}
从该方法中可以看出Lrarvel队列的redis实现是通过list结构实现的,rpush(key, value)是将value推入键值为key的redis队列,key的值则是通过$this->getQueue($queue) 获取到的
protected function getQueue($queue)
{
return 'queues:'.($queue ?: $this->default);
}
所以的redis中list中的key是 'queues:'.($queue ?: $this->default);拼接的,$this->default 的值是 RedisQueue 实例化的时候从config\queue.php配置中加载的 'queue' => 'default',$queue 是添加队列时$this->dispatch( new jobClass()->onQueue($queue) )传入的。
// config\queue.php 文件中的redis配置部分
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'default',
'expire' => 60,
],
至此,两个项目的队列冲突原因就找到了。因为redis队列配置中 'queue' => 'default' 都使用的默认的default,所以当共用redis时,默认的队列list 都是'queue:default',所以导致了冲突。
因为队列监听 监听的队列名称是由 --queue参数决定的,如果不传就是我们上面设置的默认值,若传了就会根据传入的队列名从前往后优先依次处理,具体见代码Illuminate\Queue\Worker.php中:
protected function getNextJob($connection, $queue)
{
if (is_null($queue)) {
return $connection->pop();
}
foreach (explode(',', $queue) as $queue) {
if (! is_null($job = $connection->pop($queue))) {
return $job;
}
}
}
$queue就是--queue=传入的参数,当 $queue不存在是直接调用$connection->pop()当参数存在时会将参数解析,优先处理排在前面的队列名称,将队列名称传入pop($queue), pop()会尝试从指定队列或默认队列中获取队列任务
// Illuminate\Queue\RedisQueue.php
public function pop($queue = null)
{
$original = $queue ?: $this->default;
$queue = $this->getQueue($queue);
if (! is_null($this->expire)) {
$this->migrateAllExpiredJobs($queue);
}
$job = $this->getConnection()->lpop($queue);
if (! is_null($job)) {
$this->getConnection()->zadd($queue.':reserved', $this->getTime() + $this->expire, $job);
return new RedisJob($this->container, $this, $job, $original);
}
}
至此搞清了队列执行的原理。
解决方法
将queue的配置文件中默认队列修改为不同的名称,比如: 'queue' => laravel1','queue' => laravel2'。
队列监听 php artisan queue:listen redis --queue=laravel1,syncExpress
最后
遇到问题,莫要病急乱投医。从代码入手,分析理解实现原理,找对点,解决方法也许很简单,希望对大家的学习有所帮助,也希望大家多多支持。
# Laravel队列实现
# Laravel
# 队列
# laravel5.6 框架邮件队列database驱动简单demo示例
# Laravel使用Queue队列的技巧汇总
# Docker部署Laravel应用实现队列&任务调度
# Laravel 6 将新增为指定队列任务设置中间件的功能
# Laravel 队列使用的实现
# Laravel框架队列原理与用法分析
# Laravel中为什么不使用blpop取队列详析
# 关于 Laravel Redis 多个进程同时取队列问题详解
# 源码分析 Laravel 重复执行同一个队列任务的原因
# Laravel使用消息队列需要注意的一些问题
# Laravel中利用队列发送邮件的方法示例
# 浅析Laravel5中队列的配置及使用
# PHP的Laravel框架中使用消息队列queue及异步队列的方法
# Laravel 4.2 中队列服务(queue)使用感受
# Laravel框架中队列和工作(Queues、Jobs)操作实例详解
# 解决方法
# 都是
# 病急乱投医
# 就会
# 是由
# 则是
# 很简单
# 不存在
# 可以看到
# 可以看出
# 排在
# 传了
# 配置文件
# 大家多多
# 就找
# 键值
# 清了
# 默认值
# 莫要
# 不传
相关文章:
,南京靠谱的征婚网站?
怎么将XML数据可视化 D3.js加载XML
昆明高端网站制作公司,昆明公租房申请网上登录入口?
c# Task.ConfigureAwait(true) 在什么场景下是必须的
三星网站视频制作教程下载,三星w23网页如何全屏?
如何正确下载安装西数主机建站助手?
如何通过虚拟机搭建网站?详细步骤解析
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
如何快速搭建高效服务器建站系统?
北京企业网站设计制作公司,北京铁路集团官方网站?
如何在云指建站中生成FTP站点?
Python文件管理规范_工程实践说明【指导】
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
Swift中swift中的switch 语句
建站主机SSH密钥生成步骤及常见问题解答?
如何打造高效商业网站?建站目的决定转化率
如何快速查询网址的建站时间与历史轨迹?
如何在万网开始建站?分步指南解析
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
建站为何优先选择香港服务器?
如何快速搭建高效简练网站?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
javascript基本数据类型及类型检测常用方法小结
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
建站之星如何实现PC+手机+微信网站五合一建站?
如何高效完成自助建站业务培训?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
如何构建满足综合性能需求的优质建站方案?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
网站设计制作企业有哪些,抖音官网主页怎么设置?
成都响应式网站开发,dw怎么把手机适应页面变成网页?
网站制作需要会哪些技术,建立一个网站要花费多少?
昆明网站制作哪家好,昆明公租房申请网上登录入口?
如何在万网自助建站平台快速创建网站?
如何快速查询域名建站关键信息?
如何高效搭建专业期货交易平台网站?
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
如何选择靠谱的建站公司加盟品牌?
孙琪峥织梦建站教程如何优化数据库安全?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
如何在建站主机中优化服务器配置?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
如何基于云服务器快速搭建个人网站?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
电商平台网站制作流程,电商网站如何制作?
*请认真填写需求信息,我们会在24小时内与您取得联系。