前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >EasySwoole中利用redis实现消息队列

EasySwoole中利用redis实现消息队列

作者头像
北溟有鱼QAQ
发布2020-02-21 18:06:30
1.3K0
发布2020-02-21 18:06:30
举报
文章被收录于专栏:北溟有鱼QAQ北溟有鱼QAQ

什么是队列?

  • 从数据结构上来讲,队列是一种先进先出的数据结构

什么是消息队列?

  • 消息队列可以简单理解为:把要传输的数据放在队列中
  • 消息队列可以分为生产者和消费者,将传输的数据放到消息队列当中,就相当于生产者,从消息队列中取得数据,就相当于消费者

消息队列可以用来做什么?

  • 电商的秒杀,可以防止超卖
  • 爬虫,将数据存入队列,利用多进程消费
  • 解耦,A系统中的数据放入队列,B和C以及D系统去获取数据
  • 异步限流,提升用户体验,防止系统崩溃

消息队列有哪些?

  • 常见的有redis、kafka,mqtt、以及各种MQ,当然各有各的优缺点

消息队列中最大的问题是什么?

  • 那就是数据的丢失,数据如果没有做落地,那么数据一旦丢失,将无法找回

Easyswoole中如何实现消息队列

  • 首先easyswoole提供了通用的队列驱动器,可以使用任何一种队列来进行封装使用,这里以默认的redis为例
  • composer 安装 composer require easyswoole/queue
定义一个队列
代码语言:javascript
复制
<?php
namespace App\Utility;


use EasySwoole\Component\Singleton;
use EasySwoole\Queue\Queue;

class RedisQueue extends Queue
{
    use Singleton;
}
定义消费进程
代码语言:javascript
复制
namespace App\Process;


use App\Utility\RedisQueue;
use EasySwoole\Component\Process\AbstractProcess;
use EasySwoole\Queue\Job;

class QueueProcess extends AbstractProcess
{

    protected function run($arg)
    {
        // TODO: Implement run() method.
        go(function (){
            RedisQueue::getInstance()->consumer()->listen(function (Job $job){
                var_dump($job->toArray());
            });
        });
    }
}
注册驱动以及投递任务
代码语言:javascript
复制
//在EasySwooleEvent.php 里面注册驱动
public static function mainServerCreate(EventRegister $register)
    {
        // TODO: Implement mainServerCreate() method.
        //注册redis驱动队列
        $redisData = Config::getInstance()->getConf('REDIS');
        $redisConfig = new RedisConfig($redisData);
        $redis = new RedisPool($redisConfig);
        $driver = new \EasySwoole\Queue\Driver\Redis($redis);
        RedisQueue::getInstance($driver);
        //注册消费进程
        ServerManager::getInstance()->addProcess(new QueueProcess());
        $register->add($register::onWorkerStart,function ($ser,$id){
            if($id == 0){
                Timer::getInstance()->loop(3000,function (){
				//自动投递任务
                    $job = new Job();
                    $job->setJobData(['time' => time()]);
                    RedisQueue::getInstance()->producer()->push($job);
                });
            }
        });
	}
手动或者业务中投递任务
代码语言:javascript
复制
    public function index()
    {
		$job = new Job();
		$job->setJobData(['test'=>'测试','time'=>time()]); 
		var_dump(RedisQueue::getInstance()->producer()->push($job));
	}

运行 php easyswoole start 即可看到效果实现或者手动请求index方法进行手动任务的投递

本文为北溟有鱼QAQ原创文章,转载无需和我联系,但请注明来自北溟有鱼QAQ https://www.umdzz.cn

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是队列?
  • 什么是消息队列?
  • 消息队列可以用来做什么?
  • 消息队列有哪些?
  • 消息队列中最大的问题是什么?
  • Easyswoole中如何实现消息队列
    • 定义一个队列
      • 定义消费进程
        • 注册驱动以及投递任务
          • 手动或者业务中投递任务
          • 运行 php easyswoole start 即可看到效果实现或者手动请求index方法进行手动任务的投递
          相关产品与服务
          消息队列 CMQ 版
          消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档