共计 2373 个字符,预计需要花费 6 分钟才能阅读完成。
音讯队列的概念、原理和场景
在高并发的时候,程序往往无奈做到及时的解决。咱们引入一个两头的零碎,来进行分流和减压。
所以从实质上讲:音讯队列就是一个队列构造的中间件。也就是说,你把音讯和内容放入这个容器之后就能够间接返回,不必等它前期解决的后果。另外会有一个程序,读取这些数据并依照程序解决。
1、队列构造的中间件
2、音讯放入后,不用立刻解决
3、由订阅者 / 消费者按程序解决
也就是说:当遇到一个比拟大或者耗时比拟长的环节的时候,而同时你的业务又不须要立刻晓得这个环节的后果,应用音讯队列是好的抉择。
常识付费的拼团性能应用的就是音讯队列性能;把每个拼团订单都贮存在音讯队列中,拼团实现或拼团完结就能够主动解决这个订单。
application\index\controller\PushJob
/*** 一个应用了队列的 action*/
public static function actionWithDoPinkJob(array $data,string $name=''){
try{
// 1. 当前任务将由哪个类来负责解决。$jobHandlerClassName = 'app\index\job\PullDoPink';
// 2. 当前任务归属的队列名称,如果为新队列,会主动创立
$jobQueueName = Config::get('queue_name', '') ? Config::get('queue_name','') : 'doPinkJobQueue';
// 3. 当前任务所需的业务数据 . 不能为 resource 类型,其余类型最终将转化为 json 模式的字符串
if($name){$jobData = [ 'pinkInfo' => $data, 'time' => date('Y-m-d H:i:s'),'doName'=>$name];
$isPushed = Queue::push($jobHandlerClassName , $jobData , $jobQueueName);
} else{$jobData = [ 'pinkInfo' => $data, 'time' => date('Y-m-d H:i:s')];
if (!isset($data['pink_time']) || !$data['pink_time']) return true;
$timewait = $data['pink_time'] + 300;
// 4. 将该工作推送到音讯队列,期待对应的消费者去执行
$isPushed = Queue::later($timewait, $jobHandlerClassName , $jobData , $jobQueueName);
}
if($isPushed !== false){return 1;}else{return 1;}
}catch (ErrorException $e){echo $e->getMessage();
}
}
application\index\job\PullDoPink
/**
* fire 办法是音讯队列默认调用的办法
* @param Job $job 以后的工作对象
* @param array|mixed $data 公布工作时自定义的数据
*/
public function fire(Job $job,$data)
{
// 有些音讯在达到消费者时, 可能曾经不再须要执行了
$isJobStillNeedToBeDone = $this->checkDatabaseToSeeIfJobNeedToBeDone($data);
if(!$isJobStillNeedToBeDone){$job->delete();
return;
}
if(isset($data['doName']) && $data['doName']){$doName=$data['doName'];
$isJobDone = $this->$doName($data);
}else
$isJobDone = $this->doPinkJob($data);
if ($isJobDone) {
// 如果工作执行胜利,记得删除工作
$job->delete();}else{if ($job->attempts() > 3) {$job->delete();
}
}
}
/**
* 有些音讯在达到消费者时, 可能曾经不再须要执行了
* @param array|mixed $data 公布工作时自定义的数据
* @return boolean 工作执行的后果
*/
private function checkDatabaseToSeeIfJobNeedToBeDone($data){return true;}
拼团应用,在订单生成实现后,把参数退出 $do_job_pink 数组中
PushJob::actionWithDoPinkJob($do_job_pink,’doPinkJob’);
在 application\index\job\PullDoPink 下加如上面的办法用来承受解决数据
/**
* 依据音讯中的数据进行理论的业务解决...
*/
private function doPinkJob($data)
{return true;}
如果须要加新的音讯队列能够设置不同的名称即可
PushJob::actionWithDoPinkJob($do_job_pink,’名称’);
application\index\job\PullDoPink:private function 名称($data)
{return true;}
实现后重新启动音讯队列
最初
如果你感觉这篇文章对你有点用的话,麻烦请给咱们的开源我的项目点点 star:http://github.crmeb.net/u/defu 不胜感激!
收费获取源码地址:http://www.crmeb.com
PHP 学习手册:https://doc.crmeb.com
技术交换论坛:https://q.crmeb.com
正文完