2

我是 Beanstalk + Pheanstalk 的中级。我正在使用 Beanstalk 开发我的核心部分(后台进程)。毫无疑问,这是一款出色的工具,但我陷入了一种困境。我正在使用使用 Yii 框架的 beanstalk。

假设,我有两个工作 A(Tube - A-Jobs)和 B(Tube - B-Jobs),两者都在不同的管和工人下。B 依赖于 A。B 可能会在 A 之前由工作人员首先获取并开始处理它。在这种情况下,我需要 B 延迟几秒钟(120 秒),直到 A 执行。

据我所知,没有任何直接的方法可以拖延工作。为此,您需要删除作业 B 并延迟时间放回同一队列。如果我在这里错了,请纠正我。

现在的情况是,在这种情况下我无法获得实际的管名,因为 pheanstalk 只提供作业 ID 和作业数据。我把我的代码贴在下面,

$pheanstalkA = Yii::app()->beanstalk->getClient($client);
$pheanstalkA->watch('A-tube');

$pheanstalkB = Yii::app()->beanstalk->getClient($client);
$pheanstalkB->watch('B-tube');

现在,如果我有任何使用储备功能的工作,

$jobB = $pheanstalkB->reserve();

它将为您提供如下输出,我们可以看到 beanstalk 没有提供它从中获取此作业的管道名称。

Pheanstalk_Job Object
(
    [_id:Pheanstalk_Job:private] => 2
    [_data:Pheanstalk_Job:private] => Job Data ....
)

众所周知,单个工人可以在 N 个管中观看,所以如果我想推迟这项工作并想放在同一管下。我们如何找到工作的管名?

谢谢...

4

2 回答 2

4

找到了将作业放回同一队列的新方法,并有一些延迟时间。我们可以使用pheanstalk库的直接发布功能。例如

    $this->pheanstalk->release($job,$priority,$delay);

这样,我们不需要找到工作的实际管道,并且可以节省并发问题,特别是在我的情况下。

谢谢你的帮助 !!!

于 2014-01-16T07:13:43.070 回答
4

Beanstalkd 不会随作业本身返回作业来自的管道,但您可以使用命令“stats-job”查询它。

put 1 0 100 5
hello
INSERTED 10

reserve
RESERVED 10 5
hello

stats-job 10
OK 143
---
id: 10
tube: default
state: reserved
pri: 1
age: 33
delay: 0
ttr: 100
time-left: 82
reserves: 1
timeouts: 0
releases: 0
buries: 0
kicks: 0

我放了一个简单的工作,保留它(并取回工作ID:10),然后运行'stats-job',获取id,获取原始管和其他信息。

Pheanstalk 具有statsJob您传递作业的功能(从 返回reserve)。

如果您无法了解某项特定工作的其他任何内容,您始终可以将元信息放入工作本身。

于 2014-01-06T10:58:26.267 回答