最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
用RabbitMQ和Swoole实现一个异步任务系统代码示例
时间:2022-06-24 22:16:28 编辑:袖梨 来源:一聚教程网
本篇文章小编给大家分享一下用RabbitMQ和Swoole实现一个异步任务系统代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
系统介绍
从图中可以看到,我们这个系统是一个基于事件的异步任务系统。就是说当一个事件产生时,生产者将事件抛给调度器,调度器负责查询事件下有哪些任务,然后将这些任务丢到相应的队列中,最后由消费者消费任务队列中的任务。
在整个系统中主要分为三大部分
1.事件生产者,即产生消息事件的一方。
2.任务调度器(Scheduler),负责注册事件并调度任务。
3.消费者(Worker),负责消费任务队列中的任务。
事件生产者
事件生产者很简单,在业务系统中直接调用即可,代码如下。
setOptions(['order_id' => 'FB138020392193312']); //事件产生的参数
$event->publish();
}catch (Exception $exc){
echo $exc->getMessage();
}
任务调度器
调度器主要做两件事,一是注册事件,另一个是调度任务。
注册事件代码如下:
//注册事件
EventManager::register('order_create', 'closeOrder', 'demo', 10);//关闭未付款订单(延迟任务)
EventManager::register('order_paied', 'virtualShipping', 'demo'); //虚拟商品自动发货
这样就注册了两个事件,事件下各有一个任务。
具体调度部分代码很简单,就不多赘述,有兴趣的可以去看代码。
消费者
重头戏来了,一个异步任务系统最重要的就是消费端了,现在让我们来看下Worker的流程图。
可以看到,在这里我们采用了两个交换器和两个队列,一个负责处理正常的任务即ntask,另一个负责处理需要延迟执行的任务即dtask。简单描述下一个任务的生命周期。
正常任务
1、task产生,进入正常任务的交换器Exchange[ebats_core_ntask]
2、交换器根据topic将任务分发到对应的队列中
3、子进程ntask阻塞等待成功获取到task,并执行该任务
4、执行失败,需要重试时抛出RetryException,不需要重试时抛出TaskException
5、子进程ntask捕获到重试异常将任务抛给延迟任务的交换器Exchange[ebats_core_dtask]
6、将任务执行信息回调给上层开发者以便保存查看
延迟任务
1、子进程dtask阻塞等待成功获取到task,并执行该任务
2、执行失败,需要重试时抛出RetryException,不需要重试时抛出TaskException
3、子进程dtask捕获到重试异常将任务抛给延迟任务的交换器Exchange[ebats_core_dtask]
4、将任务执行信息回调给上层开发者以便保存查看
消费者代码如下:
require_once DIR.'/../autoload.php';
require_once DIR.'/task/TaskDemoModel.php';
use AsynclibEbatsWorker;
//执行结果回调函数
$callback = function ($topic, $taskid, $taskname, $params, $timeuse, $message){
};
$worker = new Worker($callback); //支持多进程消费默认为1
$worker->setQueue('demo'); //队列名和事件的topic一一对应
$worker->run();
自定义调度器
一般来说这是一个基于事件的任务系统,那么能不能直接产生任务呢。答案是肯定的。
只需要创建一个自定义调度器,由您自行实现调度逻辑,最终生成一个任务即可。代码如下:
setExchange('order_fanout', ExchangeTypes::TOPIC);
$worker->setQueue('shzf_order_paied', ['*.*.WAIT_SELLER_SEND_GOODS']);
$worker->run(function($key, $msg){
$order_data = json_encode($msg);
echo " [$key] $order_data n";
Task::create('demo', 'orderAsync', $msg);//创建任务,之后消息将作为参数由任务接管处理
});
}catch (ExceptionInterface $exc){
echo $exc->getMessage();
}
这样,当接收到消息时就会产生一个orderAsync的任务,您只需要启动一个用来消费这个Topic的Worker即可。
相关文章
- 抖音官方充值入口-抖音充值活动任务奖励领取入口 12-18
- 哔哩哔哩在线免费畅看-2025哔哩哔哩b站网页版最新入口速览 12-18
- 一人之下漫画免费在线观看入口 | 实时缓存无延迟,网页直读免下载 12-18
- 免费PPT成品网站直播推荐-超全免费PPT模板网站盘点 12-18
- 学信网查学历-官方学历查询入口(一键验证学历信息) 12-18
- 虫虫漫画-免费漫画观看入口_海量正版漫画在线畅读平台 12-18

