Попытка обернуть Pheanstalk в мой базовый класс работы PHP. Я тестирую резервирование и резервирование с функцией задержки, и я обнаружил, что могу резервировать задание из второго экземпляра моего базового класса без первого экземпляра, освобождающего задание или истечения времени TTR. Это неожиданно, так как я думал, что это именно то, что должны предотвращать очереди заданий. Вот команды beanstalkd для первого размещения и первого резерва вместе с отметками времени. Я также делаю запрос статистики в конце:
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
Все идет нормально. Теперь я делаю еще один резерв из второго экземпляра моего базового класса, за которым следует еще один запрос статистики. Обратите внимание, что метки времени находятся в пределах одной секунды, а не около 300 секунд TTR, которые я установил. Также обратите внимание на эту вторую распечатку задания статистики, что есть 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
У кого-нибудь есть идеи о том, что я могу делать неправильно? Есть ли что-то, что я должен сделать, чтобы сообщить очереди, что я хочу, чтобы к заданиям обращался только один работник за раз? Я делаю «сброс» экземпляра peanstalk, как только получаю задание из очереди, что, как я полагаю, завершает сеанс с помощью beanstalkd. Может ли это привести к тому, что beanstalkd решит, что работник умер, и автоматически выпустит задание без тайм-аута? Я не уверен, насколько beanstalkd полагается на состояние сеанса для определения рабочего состояния. Я предполагал, что смогу открывать и закрывать сеансы безнаказанно, и что идентификатор задания был единственным, о чем beanstalkd заботился, чтобы связать операции задания вместе, но это, возможно, было глупо с моей стороны... Это мой первый набег на очереди заданий .
Спасибо!
pheanstalk->reserve()
останавливался, то есть никогда не возвращался, что приводило к тому, что мое задание cron выполнялось бесконечно, пока Apache фактически не умер. Однако я бы сказал, что как только работа будет завершена, вы, вероятно, захотите ее удалить. В противном случае он останется в очереди, а затем будет запускаться снова каждые 300 (в лучшем случае) до тех пор, пока у вас есть рабочие, выполняющие задания в очереди. Что касается связи между отключением экземпляра pheanstalk и выпуском задания, я не могу комментировать. - person Gabe Spradlin   schedule 20.03.2013