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);

Таким образом, нам не нужно находить фактический канал работы, и мы можем избежать проблем с параллелизмом, особенно в моем случае.

Спасибо за вашу помощь!!!

Другие вопросы по тегам