热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:PHPRESQUE重试机制

篇首语:本文由编程笔记#小编为大家整理,主要介绍了PHP-RESQUE重试机制相关的知识,希望对你有一定的参考价值。因为p

篇首语:本文由编程笔记#小编为大家整理,主要介绍了PHP-RESQUE重试机制相关的知识,希望对你有一定的参考价值。


因为php-Resque 的重试需要自己写,网上又没啥轮子,而且resque也很久不更新了,所以自己研究下resque的源码,然后也借鉴了Laravel的队列重试机制,实现了PHP-Resque的重试机制。


设计思路


阅读resque源码,我们知道,resque把失败的队列的数据都放在了resque:failed列表,数据如下。


技术分享图片


我的项目是在yii2下统一处理resque的,
我直接resque源码在新增了retry方法,在每一个failJob的payload增加了attempts尝试次数,
一开始创建的时候attempts为0,重试之后attempts每次加1然后进行retry,直到到达尝试数次才停止重试。



核心代码

1.调用重试的代码


/**
* Retry Job
*/
public function actionRetry()
{
$redis = new Redis(‘redis‘);
while (true) {
$json = $redis->rPop(‘resque:failed‘);
$array = json_decode($json, true);
if ($array) {
$jobArray = $array[‘payload‘];
if ($jobArray[‘attempts‘] <$this->retryTimes) {
//retry
Resque::retry($jobArray, $array[‘queue‘]);
echo "Queued job " . $jobArray[‘id‘] . ‘ has retry!‘ . "
";
} else {
//stop retry
$redis->lPush(‘resque:failed‘, [$json]);
}
}
//take a sleep
echo "*** Sleeping for ".$this->sleep. "
";
sleep($this->sleep);
}
return true;
}

这里可以弄成守护进程一直处理失败的队列任务。
2./php-resque/lib/Resque.php

/**
* retry job and save it to the specified queue.
*
* @param array $jobArray The attempts of the the job .
* array(
* ‘id‘=> The id of the job
* ‘class‘ => The name of the class that contains the code to execute the job.
* ‘args‘ => Any optional arguments that should be passed when the job is executed.‘‘
* ‘attempts‘=> The retry attempts of the job
* )
* @param string $queue The name of the queue to place the job in.
*
* @return boolean
*/
public static function retry($jobArray,$queue)
{
require_once dirname(__FILE__) . ‘/Resque/Job.php‘;
$result = Resque_Job::retry($jobArray,$queue);
if ($result) {
Resque_Event::trigger(‘afterEnqueue‘, array(
‘class‘ => $jobArray[‘class‘],
‘args‘ => $jobArray[‘args‘],
‘queue‘ => $queue,
));
}
return true;
}

3./php-resque/lib/Resque/Job.php

/**
* retry job and save it to the specified queue.
* *
* @param array $jobArray The data of the job.
* array(
* ‘id‘=> The id of the job
* ‘class‘ => The name of the class that contains the code to execute the job.
* ‘args‘ => Any optional arguments that should be passed when the job is executed.‘‘
* ‘attempts‘=> The retry attempts of the job
* )
* @param string $queue The name of the queue to place the job in.
*
* @return string
*/
public static function retry($jobArray,$queue)
{
$args = $jobArray[‘args‘];
if($args !== null && !is_array($args)) {
throw new InvalidArgumentException(
‘Supplied $args must be an array.‘
);
}
$jobArray[‘attempts‘]++;
Resque::push($queue, array(
‘class‘ => $jobArray[‘class‘],
‘args‘ => array($args),
‘id‘ => $jobArray[‘id‘],
‘attempts‘=>$jobArray[‘attempts‘]
));
return true;
}

结果:

技术分享图片


我这里我设置了重试次数为3次,每隔5秒处理一个队列。



推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 本文介绍了SPOJ2829题目的解法及优化方法。题目要求找出满足一定条件的数列,并对结果取模。文章详细解释了解题思路和算法实现,并提出了使用FMT优化的方法。最后,对于第三个限制条件,作者给出了处理方法。文章最后给出了代码实现。 ... [详细]
  • C++ STL复习(13)容器适配器
    STL提供了3种容器适配器,分别为stack栈适配器、queue队列适配器以及priority_queue优先权队列适配器。不同场景下,由于不同的序列式 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
author-avatar
023597
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有