返回顶部
首页 > 资讯 > 精选 >怎么用RabbitMQ和Swoole实现一个异步任务系统
  • 781
分享到

怎么用RabbitMQ和Swoole实现一个异步任务系统

2023-06-15 06:06:03 781人浏览 薄情痞子
摘要

这篇文章给大家分享的是有关怎么用RabbitMQ和Swoole实现一个异步任务系统的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。系统介绍从图中可以看到,我们这个系统是一个基于事件的异步任务系统。就是说当一个事件产

这篇文章给大家分享的是有关怎么用RabbitMQ和Swoole实现一个异步任务系统的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

系统介绍

怎么用RabbitMQ和Swoole实现一个异步任务系统

从图中可以看到,我们这个系统是一个基于事件的异步任务系统。就是说当一个事件产生时,生产者将事件抛给调度器,调度器负责查询事件下有哪些任务,然后将这些任务丢到相应的队列中,最后由消费者消费任务队列中的任务。

在整个系统中主要分为三大部分

事件生产者,即产生消息事件的一方。

任务调度器(Scheduler),负责注册事件并调度任务。

消费者(Worker),负责消费任务队列中的任务。

事件生产者

事件生产者很简单,在业务系统中直接调用即可,代码如下。

<?PHP require_once DIR.'/../autoload.php'; use Asynclib\Ebats\Event; try{     $event = new Event('order_paied');  //定义事件     $event->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的流程图。

怎么用RabbitMQ和Swoole实现一个异步任务系统

可以看到,在这里我们采用了两个交换器和两个队列,一个负责处理正常的任务即ntask,另一个负责处理需要延迟执行的任务即dtask。简单描述下一个任务的生命周期。

正常任务

task产生,进入正常任务的交换器Exchange[ebats_core_ntask]

交换器根据topic将任务分发到对应的队列中

子进程ntask阻塞等待成功获取到task,并执行该任务

执行失败,需要重试时抛出RetryException,不需要重试时抛出TaskException

子进程ntask捕获到重试异常将任务抛给延迟任务的交换器Exchange[ebats_core_dtask]

将任务执行信息回调给上层开发者以便保存查看

延迟任务

子进程dtask阻塞等待成功获取到task,并执行该任务
2、执行失败,需要重试时抛出RetryException,不需要重试时抛出TaskException
3、子进程dtask捕获到重试异常将任务抛给延迟任务的交换器Exchange[ebats_core_dtask]
4、将任务执行信息回调给上层开发者以便保存查看

消费者代码如下:

require_once DIR.'/../autoload.php'; require_once DIR.'/task/TaskDemoModel.php'; use Asynclib\Ebats\Worker;    //执行结果回调函数 $callback = function ($topic, $taskid, $taskname, $params, $timeuse, $message){    }; $worker = new Worker($callback);  //支持多进程消费默认为1 $worker->setQueue('demo');  //队列名和事件的topic一一对应 $worker->run();

自定义调度器

一般来说这是一个基于事件的任务系统,那么能不能直接产生任务呢。答案是肯定的。

只需要创建一个自定义调度器,由您自行实现调度逻辑,最终生成一个任务即可。代码如下:

<?php require_once DIR.'/../autoload.php'; use Asynclib\Ebats\Task; use Asynclib\Core\Consumer; use Asynclib\AMQ\ExchangeTypes; use Asynclib\Exception\ExceptionInterface;     try{     $worker = new Consumer();     $worker->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即可。

也许你会觉得这里直接写业务逻辑的代码就可以了,实际上也确实可以。当你可以忍受一个进程慢慢消费的时候是可以这样做的。但大多数情况下我们还是希望它能够尽快的消费掉,所以建议这里只负责创建任务,具体任务的业务逻辑由worker去执行。

感谢各位的阅读!关于“怎么用RabbitMQ和Swoole实现一个异步任务系统”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: 怎么用RabbitMQ和Swoole实现一个异步任务系统

本文链接: https://lsjlt.com/news/278534.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么用RabbitMQ和Swoole实现一个异步任务系统
    这篇文章给大家分享的是有关怎么用RabbitMQ和Swoole实现一个异步任务系统的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。系统介绍从图中可以看到,我们这个系统是一个基于事件的异步任务系统。就是说当一个事件产...
    99+
    2023-06-15
  • 如何用RabbitMQ和Swoole实现一个异步任务系统
    目录系统介绍事件生产者任务调度器消费者正常任务延迟任务自定义调度器系统介绍 从图中可以看到,我们这个系统是一个基于事件的异步任务系统。就是说当一个事件产生时,生产者将事件抛给调度器...
    99+
    2024-04-02
  • springboot定时任务和异步任务怎么实现
    这篇文章主要介绍“springboot定时任务和异步任务怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“springboot定时任务和异步任务怎么实现”文章能帮助大家解决问题。异步任务简单案例...
    99+
    2023-06-27
  • Django怎么实现异步任务
    本篇内容介绍了“Django怎么实现异步任务”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 对于网站来说...
    99+
    2024-04-02
  • python异步任务怎么实现
    在Python中,可以使用协程(Coroutine)和异步IO来实现异步任务。首先,需要使用`async`关键字定义一个协程函数(C...
    99+
    2023-09-22
    python
  • springboot怎么实现异步任务
    这篇“springboot怎么实现异步任务”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springboot怎么实现异步任务...
    99+
    2023-06-29
  • android异步任务怎么实现
    在Android中,可以使用AsyncTask类来实现异步任务。下面是一个简单的示例:1. 创建一个继承自AsyncTask的子类,...
    99+
    2023-08-18
    android
  • win10系统中onedrive怎么实现同步任意一个文件夹?
    我们平时还不使用这个onedrive的一个原因是设置麻烦,还不能同步文件夹,只能备份一个文件,上传一个文件,实在是心累。打开onedrive设置之后你就会清楚地发现,选择文件夹一项根本没有给你任何添加其他文件夹的机会,当...
    99+
    2023-05-21
    win10 onedrive 文件夹
  • Golang中使用RabbitMQ实现可靠的异步通知系统
    要在Golang中使用RabbitMQ实现可靠的异步通知系统,可以按照以下步骤进行:1. 安装和设置RabbitMQ:首先,需要安装...
    99+
    2023-10-08
    Golang
  • Golang RabbitMQ: 实现异步通信和系统解耦的最佳方案
    在Golang中,使用RabbitMQ可以实现异步通信和系统解耦的最佳方案。下面是一种常见的实现方式:1. 安装RabbitMQ库:...
    99+
    2023-10-08
    Golang
  • JS怎么实现异步任务队列
    本篇内容主要讲解“JS怎么实现异步任务队列”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS怎么实现异步任务队列”吧!问题有个需求,需要实现一个异步任务队列,并...
    99+
    2024-04-02
  • golang异步任务队列怎么实现
    在Go语言中,可以使用goroutine和channel来实现异步任务队列。下面是一个简单的示例代码: package main ...
    99+
    2023-10-27
    golang
  • Redis+Node.js如何实现一个能处理海量数据的异步任务队列系统
    这篇文章主要介绍了Redis+Node.js如何实现一个能处理海量数据的异步任务队列系统,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在最近...
    99+
    2024-04-02
  • JavaScript事件循环同步任务与异步任务怎么实现
    这篇文章主要介绍“JavaScript事件循环同步任务与异步任务怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript事件循环同步任务与异步任务...
    99+
    2024-04-02
  • 如何使用Python中的异步IO和协程实现一个高并发的分布式任务调度系统
    如何使用Python中的异步IO和协程实现一个高并发的分布式任务调度系统在当今高速发展的信息时代,分布式系统变得越来越普遍。而高并发的任务调度系统也成为许多企业和组织中不可或缺的一部分。本文以Python为例,介绍了如何使用异步IO和协程来...
    99+
    2023-10-27
    Python 协程 异步IO
  • 如何使用MySQL和Ruby实现一个简单的异步任务调度功能
    如何使用MySQL和Ruby实现一个简单的异步任务调度功能以前的Web应用程序大多采用同步的方式来处理请求,即用户发送请求后,服务器会立即处理完请求并返回结果。然而,随着应用程序复杂度的增加,同步方式的处理效率逐渐变得低下,因此异步任务调度...
    99+
    2023-10-22
    MySQL Ruby 异步任务调度
  • django多线程异步任务怎么实现
    在Django中,可以使用Celery来实现多线程异步任务。首先,需要安装Celery:pip install celery然后,在...
    99+
    2023-10-21
    django
  • Vue中怎么实现一个异步组件
    今天就跟大家聊聊有关Vue中怎么实现一个异步组件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。index.html<!DOCTYPE ...
    99+
    2024-04-02
  • Golang RabbitMQ: 实现异步通信、系统解耦和高性能的最佳方案
    在Golang中,实现异步通信、系统解耦和高性能的最佳方案之一是使用RabbitMQ作为消息传递中间件。RabbitMQ是一个可靠的...
    99+
    2023-10-09
    Golang
  • 在Android应用中利用异步任务实现一个进度条下载功能
    在Android应用中利用异步任务实现一个进度条下载功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。为什么要用异步任务?在Android中只有在主线程才能对u...
    99+
    2023-05-31
    android roi
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作