返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >如何用RabbitMQ和Swoole实现一个异步任务系统
  • 524
分享到

如何用RabbitMQ和Swoole实现一个异步任务系统

2024-04-02 19:04:59 524人浏览 安东尼
摘要

目录系统介绍事件生产者任务调度器消费者正常任务延迟任务自定义调度器系统介绍 从图中可以看到,我们这个系统是一个基于事件的异步任务系统。就是说当一个事件产生时,生产者将事件抛给调度器

系统介绍

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

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

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

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

3.消费者(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的流程图。

可以看到,在这里我们采用了两个交换器和两个队列,一个负责处理正常的任务即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 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实现一个异步任务系统的详细内容,更多关于用RabbitMQ和Swoole实现一个异步任务系统的资料请关注编程网其它相关文章!

--结束END--

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

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

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

猜你喜欢
  • 如何用RabbitMQ和Swoole实现一个异步任务系统
    目录系统介绍事件生产者任务调度器消费者正常任务延迟任务自定义调度器系统介绍 从图中可以看到,我们这个系统是一个基于事件的异步任务系统。就是说当一个事件产生时,生产者将事件抛给调度器...
    99+
    2024-04-02
  • 怎么用RabbitMQ和Swoole实现一个异步任务系统
    这篇文章给大家分享的是有关怎么用RabbitMQ和Swoole实现一个异步任务系统的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。系统介绍从图中可以看到,我们这个系统是一个基于事件的异步任务系统。就是说当一个事件产...
    99+
    2023-06-15
  • Redis+Node.js如何实现一个能处理海量数据的异步任务队列系统
    这篇文章主要介绍了Redis+Node.js如何实现一个能处理海量数据的异步任务队列系统,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在最近...
    99+
    2024-04-02
  • 如何使用MySQL和Ruby实现一个简单的异步任务调度功能
    如何使用MySQL和Ruby实现一个简单的异步任务调度功能以前的Web应用程序大多采用同步的方式来处理请求,即用户发送请求后,服务器会立即处理完请求并返回结果。然而,随着应用程序复杂度的增加,同步方式的处理效率逐渐变得低下,因此异步任务调度...
    99+
    2023-10-22
    MySQL Ruby 异步任务调度
  • 如何使用Python中的异步IO和协程实现一个高并发的分布式任务调度系统
    如何使用Python中的异步IO和协程实现一个高并发的分布式任务调度系统在当今高速发展的信息时代,分布式系统变得越来越普遍。而高并发的任务调度系统也成为许多企业和组织中不可或缺的一部分。本文以Python为例,介绍了如何使用异步IO和协程来...
    99+
    2023-10-27
    Python 协程 异步IO
  • Android中如何实现异步任务
    Android中如何实现异步任务,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。为了解决新线程不能更新UI组件的问题,Android提供了几种解决方案使用HanlderAci...
    99+
    2023-06-04
  • Golang中使用RabbitMQ实现可靠的异步通知系统
    要在Golang中使用RabbitMQ实现可靠的异步通知系统,可以按照以下步骤进行:1. 安装和设置RabbitMQ:首先,需要安装...
    99+
    2023-10-08
    Golang
  • SpringBoot2如何使用定时任务和异步任务
    这篇文章给大家分享的是有关SpringBoot2如何使用定时任务和异步任务的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、定时任务1、基本概念按照指定时间执行的程序。2、使用场景数据分析数据清理系统服务监控二、...
    99+
    2023-06-02
  • Java SpringBoot @Async如何实现异步任务
    本篇内容介绍了“Java SpringBoot @Async如何实现异步任务”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2023-07-04
  • Golang RabbitMQ: 实现异步通信和系统解耦的最佳方案
    在Golang中,使用RabbitMQ可以实现异步通信和系统解耦的最佳方案。下面是一种常见的实现方式:1. 安装RabbitMQ库:...
    99+
    2023-10-08
    Golang
  • 详细讲解springboot如何实现异步任务
    目录Spring Boot介绍Spring Boot特点异步任务Spring Boot介绍 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 ...
    99+
    2024-04-02
  • Django中如何使用Celery实现异步任务处理
    在Django中使用Celery实现异步任务处理需要按照以下步骤来进行: 安装Celery和Redis: pip install...
    99+
    2024-04-02
  • 如何利用Redis和Rust语言实现异步任务队列功能
    如何利用Redis和Rust语言实现异步任务队列功能引言:在当今高并发的互联网应用中,异步任务队列是非常常见和实用的功能。它可以将耗时较长的任务从主线程异步处理,提高系统的吞吐能力和响应速度。本文将介绍如何利用Redis和Rust语言实现一...
    99+
    2023-10-22
    Rust redis 异步任务队列
  • Golang RabbitMQ: 实现异步通信、系统解耦和高性能的最佳方案
    在Golang中,实现异步通信、系统解耦和高性能的最佳方案之一是使用RabbitMQ作为消息传递中间件。RabbitMQ是一个可靠的...
    99+
    2023-10-09
    Golang
  • win10系统中onedrive怎么实现同步任意一个文件夹?
    我们平时还不使用这个onedrive的一个原因是设置麻烦,还不能同步文件夹,只能备份一个文件,上传一个文件,实在是心累。打开onedrive设置之后你就会清楚地发现,选择文件夹一项根本没有给你任何添加其他文件夹的机会,当...
    99+
    2023-05-21
    win10 onedrive 文件夹
  • 如何在PHP开发中实现异步任务和消息队列?
    如何在PHP开发中实现异步任务和消息队列?随着互联网的高速发展,网站的访问量和数据处理量越来越大。为了提高用户体验和系统的稳定性,开发人员不得不考虑如何高效地处理大量的并发请求和耗时任务。异步任务和消息队列成为了解决这个问题的有效手段。异步...
    99+
    2023-11-03
    PHP编程 消息队列 异步任务
  • 在Android应用中利用异步任务实现一个进度条下载功能
    在Android应用中利用异步任务实现一个进度条下载功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。为什么要用异步任务?在Android中只有在主线程才能对u...
    99+
    2023-05-31
    android roi
  • 如何使用php Swoole实现毫秒定时计划任务
    这篇文章主要介绍了如何使用php Swoole实现毫秒定时计划任务,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。项目开发中,如果有定时任务的业务要求,我们会使用linux的c...
    99+
    2023-06-29
  • PHP和NumPy如何一起实现异步编程?
    PHP作为一种常用的服务器端编程语言,拥有强大的文本处理和Web开发能力。而NumPy是Python中科学计算的核心库之一,用于处理大规模的数值数据。虽然两者看似没有任何关系,但是它们都支持异步编程,可以实现高效的并发处理。本文将介绍如何...
    99+
    2023-10-05
    numpy 异步编程 文件
  • JavaScript如何实现异步任务循环顺序执行
    今天小编给大家分享一下JavaScript如何实现异步任务循环顺序执行的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。需求场景...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作