Нежелательное параллельное выполнение очередей 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");
Другие вопросы по тегам