Каков правильный контекст для использования брокера RabbitMQ в экосистеме PHP/laravel?Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Каков правильный контекст для использования брокера RabbitMQ в экосистеме PHP/laravel?

Сообщение Anonymous »

У нас есть система, которая собирает данные телеметрии в режиме реального времени. Брокер, которого мы нанимаем, отправляет данные телеметрии в режиме реального времени с устройства, которое они устанавливают в наших автомобилях. Эта операция работает уже два года, но мы уже два года пытаемся ее устранить и улучшить.
Оказывается, после исправления многочисленных ошибок мы начали сравнивать то, что уходит от их брокера, с тем, что поступает в нашу базу данных. Мы заметили, что некоторые пакеты просто не доходят ни в озеро данных (необработанное сообщение), ни в обрабатываемую базу данных. Поэтому мы добавили больше журналов и начали расследование. Я заметил повторяющиеся ошибки «Ошибка очереди: сломанный канал или закрытое соединение». Но в то же время, когда мы видим эту ошибку и заходим в базу данных, пакеты все равно приходят, поэтому потребитель не вылетает и не перестает получать пакеты, теряя тот. Мы установили для no_ack значение true, потому что мы используем потребителя в расписании Laravel, работая с cron 8x ежедневно. А установка no_ack значения false вызовет состояние гонки для пакета, который в конечном итоге выдаст ошибку.
Я хотел бы знать, какой контекст лучше всего подходит для потребителя? Должен ли он запускаться в супервизоре с политиками автоматического перезапуска и работать на 100 % в фоновом режиме?

Код: Выделить всё

$schedule->command('pad:cron')->weekdays()->daily();

$schedule->command('x:consumir')->cron('00 04 * * *');
$schedule->command('x:consumir')->cron('00 07 * * *');
$schedule->command('x:consumir')->cron('00 10 * * *');
$schedule->command('x:consumir')->cron('01 12 * * *');
$schedule->command('x:consumir')->cron('0 15 * * *');
$schedule->command('x:consumir')->cron('0 17 * * *');
$schedule->command('x:consumir')->cron('00 20 * * *');
$schedule->command('x:consumir')->cron('00 00 * * *');

если запустить команду на сервере - px aux | grep "x:consumir"

Код: Выделить всё

1195277  0.0  0.0   7124  3200 ?        S    00:00   0:00 sh -c '/usr/bin/php' 'artisan' x:consumir > '/dev/null' 2>&1
1195278  0.5  0.4 277348 66736 ?        S    00:00   3:56 /usr/bin/php artisan x:consumir
1199299  0.0  0.0   7124  3328 ?        S    04:00   0:00 sh -c '/usr/bin/php' 'artisan' x:consumir > '/dev/null' 2>&1
1199300  0.7  0.4 277352 67100 ?        S    04:00   3:38 /usr/bin/php artisan x:consumir
1203839  0.0  0.0   7124  3328 ?        S    10:00   0:00 sh -c '/usr/bin/php' 'artisan' x:consumir > '/dev/null' 2>&1
1203840  1.2  0.4 277360 66964 ?        S    10:00   1:45 /usr/bin/php artisan x:consumir
1310719  0.0  0.0   7124  3328 ?        S    12:01   0:00 sh -c '/usr/bin/php' 'artisan' x:consumir > '/dev/null' 2>&1
1310720  0.9  0.4 277360 64436 ?        S    12:01   0:11 /usr/bin/php artisan x:consumir
1332376  0.0  0.0   6436  2432 pts/1    S+   12:21   0:00 grep --color=auto x:consumir
А вот метод создания потребителя:

Код: Выделить всё

/**
* Execute the console command.
*
* @return mixed
*/
public function handle(){
try{
$connection = new AMQPStreamConnection('xxx.xxx.xxx', xxxx, env('user_rabbit'), env('password_rabbit'),'/', env('parameter1_rabbit'), 'AMQPLAIN', null, 'en_US', 3.0, 30.0, null, false, 60, 0);
$channel = $connection->channel();

echo " [*] Waiting for messages. To exit press CTRL+C\n";

$callback = function ($msg) {

$retorno = json_decode($msg->body);
//dd($retorno);

$this->processar($retorno);

};

$channel->basic_consume(env('user_rabbit'), '', false, true, false, false, $callback);
//consumer_tag =
//no_local=
//no_ack = this is true
//exclusive =
//nowait =

while ($channel->is_consuming()) {
$channel->wait();
}

$channel->close();
//$connection->close();
return true;
}catch(Throwable $e){
Log::debug('QUEUE ERROR: ' . $e->getMessage());
Log::debug($e->getTrace());
return true;
//dd("parar2");
}
}
Что скажешь? Где еще я могу посмотреть? Надо сказать, что точность данных составляет около 80%. Но нам нужно достичь хотя бы 95%.

Подробнее здесь: https://stackoverflow.com/questions/797 ... hp-laravel
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»