2014-01-29 3 views
0

У меня есть массив, содержащий около 8 000 биржевых котировок, которые я пытаюсь поставить в очередь; очередь предназначена для получения массива биржевых тикеров ($ символов []), а затем передает их каждому рабочему/потребителю (какой бы жаргон вы ни выбрали).Очереди Laravel - Передача данных в очередь

Вот что мой QueueController ток выглядит следующим образом:

Class QueueController extends \BaseController { 
    public function stocks() 
    { 
     $symbols = $this->select_symbols(); 
     Queue::push('StockQueue', array('symbols' => $symbols)); 
    } 
    ... 
} 

С моей QueueController, я звоню метод, чтобы получить список символов акций и передачи его в StockQueue класса как $ данных.

public function fire($job, $data) 
    { 
     $symbols = $data; // print_r shows all symbols... 

     // Get Quote Data for Symbol 
     $quote = $this->yql_get_quote($symbol); 

     // Get Key Stats for Symbol 
     $keystats = $this->yql_get_keystats($symbol); 

     // Merge Quote and Keystats into an Array 
     $array[] = $quote; 
     $array[] = $keystats; 

     // Save Data to DB 
     $this->yql_save_results($array, $symbol); 

     $job->delete(); 
    } 

Это не то, чего я пытаюсь достичь; то, что мне нужно сделать, это передать каждый символ, один за другим, в класс StockQueue и заставить его обрабатывать его как задачу.

Если бы я должен был обернуть метод StockQueue-> stock() в цикле while, он попытался бы передать все ~ 8 000 в (из того, что я понимаю) немедленно в очередь. Было бы это вредно или это лучший способ сделать это? Я не смог найти много примеров для PHP RPC Message Queuing в Интернете, поэтому я просто интересуюсь лучшими практиками, так как я нахожусь в правильном процессе.

С этим, как я могу запустить несколько рабочих для этой очереди? Скажем, я хочу 5 рабочих (в зависимости от количества ресурсов, которые каждый из них берет, я это выясню) для обработки этих задач, чтобы сократить время обработки на ~ 4/5. Как мне это сделать?

Я бы просто запустил php artisan queue:listen пять раз?

И для ясности я использую beanstalkd и supervisord для выполнения очереди сообщений/мониторинга.

Я с нетерпением жду вашего совета и понимания.

ответ

1

Да, просто запустить больше рабочих. Beanstalkd может содержать несколько соединений, открытых от множества рабочих, и убедиться, что у них все разные рабочие места. Просто убедитесь, что работа завершена успешно (если нет, справитесь с ней надлежащим образом или, по крайней мере, похороните ее, чтобы посмотреть на нее позже) и дайте ей достаточно, чтобы завершить, а некоторые - в настройке TTR (Time To Run).

Что касается запуска большего количества рабочих мест - да, просто увеличьте количество вакансий, доступных в Supervisord (numprocs=5 в разделе [program:NAME]), и начните их. Я имел тенденцию иметь другой (более крупный) пул из тех же самых заданий, которые не запускаются автоматически, поэтому я мог бы запустить еще пару вручную через элемент управления Supervisord, если это необходимо.

+0

Awesome. Спасибо за понимание. Я собираюсь попробовать это сегодня вечером. – DroBuddy

Смежные вопросы