尝试将Pheanstalk包装在PHP作业基类中。我正在测试具有延迟功能的保留和保留,我发现我可以从基类的第二个实例中保留一个作业,而不会在第一个实例释放作业或TTR超时的情况下。这是意想不到的,因为我认为这正是作业队列应该防止的事情。下面是用于第一次put和第一次保留的beanstalkd命令以及时间戳。最后我还做了一个stats-job请求:
01:40:15: Sending command: use QueuedCoreEvent
01:40:15: Got response: USING QueuedCoreEvent
01:40:15: Sending command: put 1024 0 300 233
a:4:{s:9:"eventName";s:21:"ReQueueJob_eawu7xr9bi";s:6:"params";a:2:{s:12:"InstanceName";s:21:"ReQueueJob_eawu7xr9bi";s:17:"aValueToIncrement";i:123456;}s:9:"behaviors";a:1:{i:0;s:22:"BehMCoreEventTestDummy";}s:12:"failureCount";i:0;}
01:40:15: Got response: INSERTED 10
01:40:15: Sending command: watch QueuedCoreEvent
01:40:15: Got response: WATCHING 2
01:40:15: Sending command: ignore default
01:40:15: Got response: WATCHING 1
01:40:15: Sending command: reserve-with-timeout 0
01:40:15: Got response: RESERVED 10 233
01:40:15: Data: a:4:{s:9:"eventName";s:21:"ReQueueJob_eawu7xr9bi";s:6:"params";a:2:{s:12:"InstanceName";s:21:"ReQueueJob_eawu7xr9bi";s:17:"aValueToIncrement";i:123456;}s:9:"behaviors";a:1:{i:0;s:22:"BehMCoreEventTestDummy";}s:12:"failureCount";i:0;}
01:40:15: Sending command: stats-job 10
01:40:15: Got response: OK 162
01:40:15: Data: ---
id: 10
tube: QueuedCoreEvent
state: reserved
pri: 1024
age: 0
delay: 0
ttr: 300
time-left: 299
file: 0
reserves: 1
timeouts: 0
releases: 0
buries: 0
kicks: 0到现在为止还好。现在,我从基类的第二个实例中执行另一个保留,然后是另一个stats-job请求。请注意,时间戳在同一秒内,与我设置的300秒TTR相差甚远。还请注意,在第二个stats-job打印输出中,此作业有2个保留项,超时和释放分别为0和0。
01:40:15: Sending command: watch QueuedCoreEvent
01:40:15: Got response: WATCHING 2
01:40:15: Sending command: ignore default
01:40:15: Got response: WATCHING 1
01:40:15: Sending command: reserve-with-timeout 0
01:40:15: Got response: RESERVED 10 233
01:40:15: Data: a:4:{s:9:"eventName";s:21:"ReQueueJob_eawu7xr9bi";s:6:"params";a:2:{s:12:"InstanceName";s:21:"ReQueueJob_eawu7xr9bi";s:17:"aValueToIncrement";i:123456;}s:9:"behaviors";a:1:{i:0;s:22:"BehMCoreEventTestDummy";}s:12:"failureCount";i:0;}
01:40:15: Sending command: stats-job 10
01:40:15: Got response: OK 162
01:40:15: Data: ---
id: 10
tube: QueuedCoreEvent
state: reserved
pri: 1024
age: 0
delay: 0
ttr: 300
time-left: 299
file: 0
reserves: 2
timeouts: 0
releases: 0
buries: 0
kicks: 0有谁知道我可能做错了什么吗?我是否需要做些什么才能告诉队列我希望作业一次只能由一个工作进程访问?一旦我把作业从队列中拿出来,我就在pheanstalk实例上做一个"unset“,我相信它会用beanstalkd终止会话。这是否会导致beanstalkd确定工人已经死亡,并自动释放作业而不超时?我不确定beanstalkd在多大程度上依赖会话状态来确定工作者状态。我假设我可以不受惩罚地打开和关闭会话,而工作id是beanstalkd唯一关心的将工作操作联系在一起的事情,但这对我来说可能是愚蠢的……这是我第一次尝试使用作业队列。
谢谢!
发布于 2013-04-02 05:55:41
我的猜测是您的第一个客户端实例在第二个客户端实例保留作业之前关闭了到beanstalkd服务器的TCP套接字。
隐式关闭TCP连接会将作业释放回队列。这些隐式释放(关闭连接、quit命令等)似乎不会增加releases计数器。
下面是一个例子:
# Create a job, reserve it, close the connection:
pda@paulbookpro ~ > telnet 0 11300
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.
put 0 0 600 5
hello
INSERTED 1
reserve
RESERVED 1 5
hello
^]
telnet> close
Connection closed.
# Reserve the job, stats-job shows two reserves, zero releases.
# Use 'quit' command to close connection.
pda@paulbookpro ~ > telnet 0 11300
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.
reserve
RESERVED 1 5
hello
stats-job 1
OK 151
---
id: 1
tube: default
state: reserved
pri: 0
age: 33
delay: 0
ttr: 600
time-left: 593
file: 0
reserves: 2
timeouts: 0
releases: 0
buries: 0
kicks: 0
quit
Connection closed by foreign host.
# Reserve the job, stats-job still shows zero releases.
# Explicitly release the job, stats-job shows one release.
pda@paulbookpro ~ > telnet 0 11300
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.
reserve
RESERVED 1 5
hello
stats-job 1
OK 151
---
id: 1
tube: default
state: reserved
pri: 0
age: 46
delay: 0
ttr: 600
time-left: 597
file: 0
reserves: 3
timeouts: 0
releases: 0
buries: 0
kicks: 0
release 1 0 0
RELEASED
stats-job 1
OK 146
---
id: 1
tube: default
state: ready
pri: 0
age: 68
delay: 0
ttr: 600
time-left: 0
file: 0
reserves: 3
timeouts: 0
releases: 1
buries: 0
kicks: 0
quit
Connection closed by foreign host.发布于 2018-10-25 16:56:36
我也有同样的问题。问题出在打开到beanstalkd的多个连接。
use Pheanstalk\Pheanstalk;
$pheanstalk = connect();
$pheanstalk->put(serialize([1]), 1, 0, 1800);
/** @var Job $job */
$job = $pheanstalk->reserve(10);
print_r($pheanstalk->statsJob($job->getId()));
// state reserved but
// only those connection that reserved a job can resolve/update it
$pheanstalk2 = connect();
print_r($pheanstalk->statsJob($job->getId()));
$pheanstalk2->delete($job);
// new connection opened in same process still cannot update the job
// PHP Fatal error: Uncaught Pheanstalk\Exception\ServerException: Cannot delete job 89: NOT_FOUND in /var/www/vendor/pda/pheanstalk/src/Command/DeleteCommand.php:45
function connect() {
$pheanstalk = new Pheanstalk(
'localhost',
11300,
5
);
return $pheanstalk;
}https://stackoverflow.com/questions/15468850
复制相似问题