专栏首页技术小牛php的消息队列框架resque的使用小结

php的消息队列框架resque的使用小结

前段时间在开发一个量化交易系统,这是一个类似股票交易软件的系统:股票价格变化后要实时在终端(APP)的行情价格页面实时更新,如果用户是在持仓页面,还要计算持仓盈亏及预付款比例,因为有一个强制平仓机制(当预付款比较低于30%时系统要自动触发强制平仓),因为行情波动非常快(有些产品一秒钟内价格会变化五六次),所以当某个产品的价格变化时,要触发一系统的行情推送(通过长连接)及盈亏计算操作。

因为价格变动非常快,如果使用同步操作的话,很容易造成阻塞,所以用异步消息队列是比较好的选择,在网上查了一番,决定用resque来实现,试用了一下,发现网上所谓的resque教程大都是将它的demo代码讲解了一遍,坑很多,所以把我试用过程中遇到的问题统一做个记录,一个是方便同样正在尝试使用resque的朋友,二是作为自己的备忘录,好,下面正式开始。

Part 1.安装

网上很多教程的指引还是安装源chrisboulton/php-resque版本的,实际上现在最新的版本应该是resque/php-resque源的, 用composer安装的方法是,在composer.json文件中的require节点下添加”resque/php-resque:^1.2”,

然后执行composer install即可。

Part2.连接设置了密码的redis

resque是基于redis的,所以没有redis是运行不起来的,可能开发者初期没有考虑到redis有设置了密码的情况,所以我刚开始看网上的资料是有介绍怎样解决这个问题的,但我把代码签出来后发现Resque::setBackend的方法是支持传入auth参数的,于是以为这个问题已经在目前的版本里解决了,实际上还是不行,如果你的redis里设置了密码,建议修改插件目录下的resque/php-resque/lib/Resque.php这个文件,大概在68行将创建redis连接的代码用以下代码代替可以解决连接redis失败的问题。

$redis = new Redis();
$redis->connect(self::$redisServer);
$redis->auth(self::$auth);
$redis->select(self::$redisDatabase);
self::$redis = $redis;

修改完后将redis的密码通过setBackend方法的第三个参数传入就可以了,示例:

Resque::setBackend('127.0.0.1', 1, \Config::$redis['option']['auth']);

Part3.运行

如果你看了其它网友的经验分享,你会知道resque有三个角色:Queue、Worker、Job,Queue负责接收消息队列,Worker负责任务调度,Job负责执行业务逻辑,用现实生活举例就是像一个高铁站一样,Queue是售票厅、Worker是控制室、Job则是车队,以下我也分三部分说下这个注意事项:

  • Queue: 按照业务逻辑需要,Queue在何时何地执行都可以的,因为作为一个消息队列,肯定要支持动态添加任务进去,有一点要注意的是,如果你的Job类有命名空间,一定要将完整的路径写进去,我在这里卡了一下,以为在Job类里通过use引入了这个命名空间即可,但实际上行不通,必须在调用enqueue方法时传入带命名空间的路径才能正常执行,下面是一个示例:
Resque::setBackend('127.0.0.1', 1, \Config::$redis['option']['auth']);
for($i = 1; $i < 10; $i++){
    Resque::enqueue('pushMarketPrice', '\site_pc\action\Job', ['newPrice' => 1367.85, 'rate' => 7.09]);
}
  • Worker 从demo文件可以看出,Worker就是要加载Job类及bin下的resque文件,但demo里并不是面向对象的写法,如果要定义在一个类里,可以参照以下写法:
class Worker{
    /**
     * @router cli work
     */
    public function run(){
        require "../vendor/resque/php-resque/bin/resque";
    }
}

其中,require后面的路径请修改为相对你项目执行文件入口的路径。

  • Job Job类就比较简单,记着要实现一个perform方法就方法了,另外,demo里没有体现的一个细节是在Queue中传入的参数怎样获取,其实很简单,在perform方法通过$this->args就能拿到传入的参数数组,非常方便。
class Job{
    public function perform(){
        Tools::logToDb('resque', $this->args);
    }
}

$this->args就是你此前在Queue中传入的自定义参数数组了。

Part4.监控

怎样判断resque的状态(是否在正常运行中)呢?还有如果已经在运行,怎样重启?可以通过查看进程的命令来达到这个目的,登录系统后执行: ps -aux | grep resque 如果resque正在运行中,你看到的界面应该是这样的:

其中,上图椭圆形圈中的是进程ID,如果希望停止运行,可以使用kill -9 [进程id]来杀死进程,红方框则是进程状态,正在等待队列中的任务。一有任务就会执行,至此,这个插件已经在正常运行了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • DevOps工具介绍连载(7)——Resque

    作者:Amazing大龙大龙 链接:https://www.jianshu.com/p/a39904a0ba01 来源:简书

    小老鼠
  • PHP-Beanstalkd消息队列 延迟队列的搭建使用

    sinnoo
  • Python使用redis的消息队列

    Criss@陈磊
  • 如何使用消息队列的事务消息

    “发消息”过程,往往是为通知另外一个系统更新数据,MQ的“事务”,主要解决消息生产者和消息消费者的数据一致性问题。

    JavaEdge
  • PHP使用ActiveMQ实现消息队列的方法详解

    本文实例讲述了PHP使用ActiveMQ实现消息队列的方法。分享给大家供大家参考,具体如下:

    砸漏
  • 什么是消息队列?消息队列使用场景是怎样的?

    小红希望小明多读书,常寻找好书给小明看,之前的方式是这样:小红问小明什么时候有空,把书给小明送去,并亲眼监督小明读完书才走。久而久之,两人都觉得麻烦。

    lyb-geek
  • 消息队列的使用(kafka举例)

    居士
  • awesome-php

    收集整理一些常用的PHP类库, 资源以及技巧. 以便在工作中迅速的查找所需… 这个列表中的内容有来自 awesome-php 的翻译, 有来自开发者周刊以及个人...

    guanguans
  • ActiveMQ消息队列的使用及应用

    ActiveMQ消息队列的使用及应用 这里就不说怎么安装了,直接解压出来就行了。 谢绝转载,作者保留所有权力 目录: 复制代码 一:JMQ的两种消息模式 1.1...

    企鹅号小编
  • 使用消息队列的 10 个理由

    过去几年中,我们一直在使用、构建和宣传消息队列,我们认为它们是很令人敬畏的,这也不是什么秘密。我们相信对任何架构或应用来说,消息队列都是一个至关重要的组件,下面...

    Java_老男孩
  • celery+rabbitmq分布式消息队列的使用

    專 欄 ❈ 作者:nmask,信息安全工程师 博客地址: https://thief.one/ ❈ 之前在分布式消息队列上我一直使用rabbi...

    Python中文社区
  • 使用消息队列(MQ)的 10 个理由!

    在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。消息队列在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。这允许你独立...

    Java技术栈
  • PHP Beanstalkd消息队列的安装与使用方法实例详解

    本文实例讲述了PHP Beanstalkd消息队列的安装与使用方法。分享给大家供大家参考,具体如下:

    砸漏
  • 消息队列使用的四种场景介绍

    消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题

    lyb-geek
  • 消息队列使用的四种场景介绍

    消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题

    李海彬
  • 消息队列在使用中的注意事项

    消息队列在使用中的注意事项 异步不是万能的,实现异步重要的手段,消息队列在使用中也是有很多注意事项的。 消息队列的瓶颈 消息队列至少有三处容易出现瓶颈,我们一经...

    netkiller old
  • 消息队列在使用中的注意事项

    消息队列在使用中的注意事项 异步不是万能的,实现异步重要的手段,消息队列在使用中也是有很多注意事项的。 消息队列的瓶颈 消息队列至少有三处容易出现瓶颈,我们一经...

    netkiller old
  • 消息队列简介及 RabbitMQ 的使用方法

    消息队列是最古老的中间件之一,从系统之间有通信需求开始,就自然产生了消息队列。如果你还没有用过消息队列,那是时候好好学习一下了。本文告诉什么是消息队列,为什么需...

    somenzz
  • Linux——Linux系统编程之进程间的通信-消息队列的使用总结(基本概念、消息队列相关函数、使用实践测试)

    上一博文总结了Linux下无名管道和有名管道的使用,因为代码量比较多,篇幅限制(太长了的话自己都不愿意看了,又长又臭),所以把消息队列单独作为一篇文章进行总结。

    Winter_world

扫码关注云+社区

领取腾讯云代金券