全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

浅谈Laravel队列实现原理解决问题记录

问题

公司项目使用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小时内与您取得联系。