Отработка отказа Beanstalkd для очередей в Laravel

Кто-нибудь знает о надежном механизме отработки отказа для очередей Laravel?

В какой-то момент мой сервер beanstalkd обнаружил какую-то ошибку (все еще выясняя, что пошло не так), вызвав Pheanstalk_Exception_ConnectionException в драйвере очереди Laravel (4). В результате новые задания не могут быть помещены в очередь.

То, что я пытаюсь сделать, это иметь какой-то драйвер аварийного переключения для QueueInterface который может принимать несколько экземпляров драйверов, поэтому я могу определить, например, драйвер ‘sync’ или ‘redis’ как очередь аварийного переключения. Затем, как только beanstalkd выйдет из строя, этот драйвер выполнит задания, и работа не будет потеряна.

2

Решение

Я просто собираюсь сделать небольшой удар для вас и надеюсь, что это дает представление … я думаю, что у всех разные потребности в очередях, так что это именно то, что я сделал.

Честно говоря, я просто отбросил кучу своего кода, чтобы попытаться упростить то, что я сделал. Я думаю, постараюсь найти в этом смысл.

В вашей конфигурации очереди:

'connections' => array(
'beanstalkd' => array(
'driver' => 'beanstalk_extended',
'host'   => 'my.ip.address',
'queue'  => 'default',
'ttr'    => 60,
),
'my_fallback' => array(
'driver' => 'sync',
),
);

В ServiceProvider @ boot:

/**
* Boot the Beanstalkd queue.
*/
protected function bootQueue()
{
$this->app['queue']->extend('beanstalk_extended', function () {
return new BeanstalkConnector;
});

$this->app->bindShared('queue.failer', function($app) {
$config = $app['config']['queue.failed'];
return new DatabaseFailedJobProvider($app['db'], $config['database'], $config['table']);
});

$this->app->bindShared('queue.worker', function($app) {
return new Worker($app['queue'], $app['queue.failer'], $app['events']);
});
}

Разъем:

<?php namespace App\Framework\Queue\Connectors;

use Illuminate\Queue\Connectors\ConnectorInterface;
use Pheanstalk_Pheanstalk as Pheanstalk;
use App\Framework\Queue\Beanstalk;

class BeanstalkConnector implements ConnectorInterface
{

/**
* Establish a queue connection.
*
* @param  array $config
* @return \Illuminate\Queue\QueueInterface
*/
public function connect(array $config)
{
$pheanstalk = new Pheanstalk($config['host']);
$bean = new Beanstalk($pheanstalk, $config['queue'], array_get($config, 'ttr', Pheanstalk::DEFAULT_TTR));
return $bean;
}
}

Затем внутри расширения Beanstalkd:

/**
* Push a new job onto the queue.
*
* @param  string $job
* @param  mixed $data
* @param  string $queue
* @return int
*/
public function push($job, $data = '', $queue = null)
{
try {
$queue = $this->getQueue($queue);
$id = parent::push($job, $data, $queue);
return $id;
} catch (\Exception $e) {
return \Queue::connection('my_fallback')->push($job, $data, $queue);
}
}
2

Другие решения

Других решений пока нет …