Нежелательное параллельное выполнение очередей Laravel IronMq
Я пытаюсь установить очередь IronMq с Laravel, и она у меня уже работает, но дело в том, что поведение не является желаемым.
Я ожидаю, что IronMq будет ждать завершения задания ($job->delete()), чтобы выдвинуть новую, но я обнаружил, что она отправляет сообщения до завершения предыдущей.
Код структурирован следующим образом:
Route::post('queue/send' ,function()
{
...
Queue::push(function($job) use ($data)
{
...
$job->delete();
}
return true;
}
Кто-нибудь нашел способ предотвратить параллельное поведение и сделать его последовательным?
Большое спасибо!
3 ответа
Спасибо за ваши ответы, я решил использовать Beanstalkd вместо IronMQ.
Это намного более грязно, но это обеспечивает желаемую функциональность, и я ни от кого не зависим.
Push-очереди, естественно, будут продолжать отправлять сообщения независимо от того, выполняется ли задание или нет, поскольку они являются 2 независимыми системами. Во-вторых, цель использования push-очереди состоит в том, чтобы она была в режиме реального времени, насколько это возможно.
IronMQ, в частности, имеет повторные попытки , которые, как это звучит, будут повторять отправку сообщения к желаемой конечной точке X количество раз (которое вы установили) в назначенные интервалы (которые вы установили) - надеюсь, это поможет решить ваши проблемы.
Если вы хотите, чтобы задание обрабатывалось только после завершения предыдущего и допустима небольшая задержка, я бы порекомендовал опросить очередь и получить ее партиями.
Также вы можете попробовать использовать класс IronMQ вместо класса очереди laravel:
$ironmq = new \IronMQ(array(
'token' => Config::get('queue.connections.iron.token', 'xxx'),
'project_id' => Config::get('queue.connections.iron.project', 'xxx')
));
$ironmq->postMessage($queue_name, "Hello world");