Laravel队列 - 将数据传递到队列

时间:2014-01-29 23:22:20

标签: php laravel message-queue beanstalkd

我有一个包含约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来进行消息队列/监视。

我期待着您的建议和见解。

1 个答案:

答案 0 :(得分:1)

是的,只是运行更多的工人。 Beanstalkd可以容纳许多工人打开的连接,并确保他们都能获得不同的工作。只需确保作业成功完成(如果没有,请至少妥善处理 - 或者至少埋葬它以便稍后查看)并给予足够的完成,并在TTR(Time To Run)设置中备用。

至于如何运行更多工作 - 是的,只需增加Supervisord中可用的工作数量(numprocs=5部分中的[program:NAME])并启动它们。我倾向于拥有另一个(更大)相同作业的池,它们不会自动启动,所以我可以根据需要通过Supervisord控件手动启动一些。