Beanstalk + Pheanstalk Задержка Существующей Работы
Я промежуточный в Beanstalk + Pheanstalk. Я разрабатываю свою основную часть (фоновый процесс), используя Beanstalk. Это отличный инструмент, без сомнения, но я застрял в одной ситуации. Я использую beanstalk, используя Yii Framework.
Допустим, у меня есть две вакансии A (Tube - A-Jobs) и B (Tube - B-Jobs), и обе находятся под разными лампами и рабочими. B зависит от A. Вполне возможно, что B сначала получит работника до A и начнет процесс с ним. В этом случае мне нужно, чтобы B задержался на несколько секунд (120 секунд) до тех пор, пока не выполнится.
Насколько мне известно, прямого способа задержать работу нет. Для этого вам нужно удалить задание B и вернуть его в ту же очередь с задержкой. Поправь меня, если я здесь не прав.
Теперь ситуация такова, что я не могу получить реальное имя трубки в этом случае, потому что pheanstalk предоставляет только Job Id и Job Data. Я вставляю тебе мой код ниже,
$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 трубки, поэтому, если я хочу отложить эту работу и хочу поставить под ту же трубку. Как мы можем найти название трубы работы?
Спасибо...
2 ответа
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
Я вставил простую работу, зарезервировал ее (и вернул идентификатор задания: 10), затем запустил "stats-job", для идентификатора, получение оригинальной трубки и другую информацию.
Pheanstalk имеет statsJob
функция, которую вы передаете в работе (как возвращено из reserve
).
Если есть что-то еще, чего вы не можете получить о конкретной работе, вы всегда можете поместить метаинформацию в саму работу.
Найден новый способ вернуть задание в ту же очередь с некоторой задержкой. Мы можем использовать функцию прямого выпуска библиотеки pheanstalk. например
$this->pheanstalk->release($job,$priority,$delay);
Таким образом, нам не нужно находить фактический канал работы, и мы можем избежать проблем с параллелизмом, особенно в моем случае.
Спасибо за вашу помощь!!!