2014-01-29 64 views
0

我有一個包含約8,000個股票代碼的數組,我嘗試排隊;該隊列旨在接收股票代碼($ symbols [])數組,然後將每個代碼傳遞給工人/消費者(以您喜歡的任何術語爲準)。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類,並將其作爲一項任務來處理。

如果我要在while循環中包裝StockQueue-> stocks()方法,它會嘗試並將所有〜8,000(根據我的理解)立即傳遞給隊列。這會是有害的還是這是做到這一點的最佳方式?我一直無法找到很多基於PHP的在線RPC消息隊列示例,所以我對正確的流程中的最佳實踐感到好奇。

這樣說,我怎麼能爲這個隊列啓動多個工人?比如,我想要5名工人(取決於每個人需要多少資源;我會解釋這些)來處理這些任務,以便將處理時間減少約四分之五。我會怎麼做?

我只是五次啓動php artisan queue:listen

而且,爲了清楚起見,我使用beanstalkd和supervisord來執行消息隊列/監視。

我期待您的建議和見解。

回答

1

是的,只是運行更多的工人。 Beanstalkd可以容納很多工作人員開放的一些連接,並確保他們都得到不同的工作。只要確保作業成功完成(如果不成功,則適當地處理它 - 或者至少將其埋葬到稍後看),並且足夠完成,並且有一些要在TTR(Time To Run)設置中備用。

至於如何運行更多的工作 - 是的,只需增加Supervisord中可用的工作數量(numprocs=5,[program:NAME]部分)並讓他們開始。我傾向於有另一個(更大的)相同的工作池,不會自動啓動,所以我可以根據需要通過Supervisord控件手動啓動更多的工作。

+0

太棒了。感謝您的洞察力。今晚我會試試這個。 – DroBuddy