我有一个包含约8,000个股票代码的数组,我正在尝试排队;队列意味着接收股票代码数组($ symbols []),然后将每个代码传递给工人/消费者(您喜欢的任何行话)。
这是我的QueueController当前的样子:
Class QueueController extends \BaseController {
public function stocks()
{
$symbols = $this->select_symbols();
Queue::push('StockQueue', array('symbols' => $symbols));
}
...
}
从我的QueueController,我正在调用一个方法来检索股票代码列表并将其作为$ data传递给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 in(从我理解的)立即传递到队列。这会有害吗?或者这是最好的方法吗?我无法在网上找到很多基于PHP的RPC消息队列的例子,所以我对最佳实践一样好奇,因为我在正确的过程中。
话虽如此,我怎样才能为这个队列启动多个工作人员?说,我想要5个工人(取决于每个人需要多少资源;我会想出来)来处理这些任务,以便将处理时间减少〜4/5秒。我该怎么做?
我只会推出php artisan queue:listen
五次吗?
而且,为了清楚起见,我使用beanstalkd和supervisord来进行消息队列/监视。
我期待着您的建议和见解。
答案 0 :(得分:1)
是的,只是运行更多的工人。 Beanstalkd可以容纳许多工人打开的连接,并确保他们都能获得不同的工作。只需确保作业成功完成(如果没有,请至少妥善处理 - 或者至少埋葬它以便稍后查看)并给予足够的完成,并在TTR(Time To Run)设置中备用。
至于如何运行更多工作 - 是的,只需增加Supervisord中可用的工作数量(numprocs=5
部分中的[program:NAME]
)并启动它们。我倾向于拥有另一个(更大)相同作业的池,它们不会自动启动,所以我可以根据需要通过Supervisord控件手动启动一些。