第二次和第三次重试的 Beanstalkd 自定义任务延迟
Beanstalkd custom task delay for 2nd and 3rd retry
我将 Beanstalkd(带有 - https://github.com/udokmeci/yii2-beanstalk)用于队列。但是我需要为下次重试设置自定义延迟,
第一 - 毫不拖延
2 - 一个小时后
第 3 - 24 小时后
可以用 Beanstalkd 实现吗?
public function actionCron($job)
{
$sentData = $job->getData();
try {
// I need to setup custom delay there
// 1 hour after 1st retry
// 24 hrs after 2nd retry
return self::DELAY;
} catch (\Exception $e) {
//If there is anything to do.
fwrite(STDERR, Console::ansiFormat($e . "\n", [Console::FG_RED]));
// you can also bury jobs to examine later
return self::BURY;
}
}
很有可能 - 通过向 Beanstalkd 服务器询问有关作业的统计信息。
来自 Beanstalk protocol.txt 文件:
stats-job <id>\r\n
返回的数据包括job之前被保留、释放的次数,来自哪个tube-name等。您可以根据需要使用最合适的数据重新排队。
因为你不能改变数据来延迟它,只能创建一个新的作业,一个选项是将它放入一个新的队列中进行第二次或第三次尝试,并有适当的初始延迟,然后如果作业来自重试队列(在第一次或第二次尝试之后),在它再次 运行 之前更改初始延迟。
由于您可以尝试从多个队列中获取作业,因此您只需让代码观察主队列,也 第二次/第三次尝试管并查看他们得到什么,酌情处理。
我将 Beanstalkd(带有 - https://github.com/udokmeci/yii2-beanstalk)用于队列。但是我需要为下次重试设置自定义延迟,
第一 - 毫不拖延 2 - 一个小时后 第 3 - 24 小时后
可以用 Beanstalkd 实现吗?
public function actionCron($job)
{
$sentData = $job->getData();
try {
// I need to setup custom delay there
// 1 hour after 1st retry
// 24 hrs after 2nd retry
return self::DELAY;
} catch (\Exception $e) {
//If there is anything to do.
fwrite(STDERR, Console::ansiFormat($e . "\n", [Console::FG_RED]));
// you can also bury jobs to examine later
return self::BURY;
}
}
很有可能 - 通过向 Beanstalkd 服务器询问有关作业的统计信息。
来自 Beanstalk protocol.txt 文件:
stats-job <id>\r\n
返回的数据包括job之前被保留、释放的次数,来自哪个tube-name等。您可以根据需要使用最合适的数据重新排队。
因为你不能改变数据来延迟它,只能创建一个新的作业,一个选项是将它放入一个新的队列中进行第二次或第三次尝试,并有适当的初始延迟,然后如果作业来自重试队列(在第一次或第二次尝试之后),在它再次 运行 之前更改初始延迟。
由于您可以尝试从多个队列中获取作业,因此您只需让代码观察主队列,也 第二次/第三次尝试管并查看他们得到什么,酌情处理。