Iron.io推送队列和Laravel 4 - 防止队列请求多次运行

时间:2013-11-18 14:27:21

标签: php laravel-4 ironmq

我有一个推送队列设置拨打相当多的电话号码并播放录音 - 由Twilio提供的爆炸通知系统。迭代每个号码并拨打电话需要时间,因此我希望使用推送队列来加速应用程序的导航。

我过去曾试图在Laravel 4中使用Iron.io推送队列,似乎任何需要一段时间才能运行的任务,或者如果HTTP请求起初很慢,fire()中的代码方法运行多次,即使使用$job->delete()

以下是我的队列处理程序的一个示例 -

    class callLotsOfPeople {
    public function fire($job, $data) {
        // Do stuff with data, like calling lots of people.. takes time
        $job->delete();
        // For some reason this method can be called multiple times after a single queue push, 
        // resulting in multiple phone calls and angry clients
    }
}

2 个答案:

答案 0 :(得分:2)

这可能为时已晚,但我遇到了同样的问题。我找到了一个修复程序,并提交了一个拉取请求,将其包含在Laravel 4.1中。

基本上,代码更改允许您传递像这样的$ options数组

Queue::push('MyJob', $message, $queue, array('timeout' => 300));

IronMQ.class.php中已经有了这个功能,但是我找不到从Laravel传递它们的简单方法。希望他们包括这一点,使多个工作提交问题消失。 : - )

https://github.com/laravel/framework/pull/3555

编辑:更改了Queue :: pull to Queue :: push,小错字。

答案 1 :(得分:1)

我还没有充分利用推送队列,但快速浏览一下IronMQ文档会发现以下内容:

  

长时间运行的流程 - 又名202的

     

如果您想花一些时间来处理消息,超过60秒超时,您必须使用HTTP状态代码202进行响应。确保在将消息发布到最大数量时设置“超时”值您希望自己处理的时间。如果在“超时”过去之前未明确删除消息,则将重试该消息。要删除邮件,请选中“Iron-Subscriber-Message-Url”标头,然后向该网址发送DELETE请求。

     

via:http://dev.iron.io/mq/reference/push_queues/#long_running_processes__aka_202s

现在,由于有效负载是在幕后创建的,没有轻松访问,因此Laravel目前似乎不支持超时。您可以在4.1分支上创建Pull请求以专门为Iron推送队列实现此功能(提示:您需要编辑QueueInterface和所有Queue驱动程序的push()函数)。

作为一种解决方法,也许你可以从一开始就$job->delete()(而不是在耗时的任务之后)而只是再次Queue::push()(如果有错误,还是其中的一部分?类似的东西:

    class callLotsOfPeople {
        public function fire($job, $data) {
            $job->delete();

            // Do stuff with data, like calling lots of people.. takes time

            if ($error) {
                    Queue::push(...);
            }
        }
    }

让我知道它是怎么回事,未来我可能会有类似的情况,想知道你是如何解决的!