【问题标题】:Undesired parallel execution of Laravel IronMq QueuesLaravel IronMq 队列的非预期并行执行
【发布时间】:2014-05-06 16:30:36
【问题描述】:

我正在尝试使用 Laravel 设置 IronMq 队列,并且我已经让它工作了,但关键是该行为不是我们想要的。

我希望 IronMq 等到一个作业完成 ($job->delete()) 来推送一个新的,但我发现它会在前一个完成之前推送消息。

代码结构如下:

Route::post('queue/send' ,function() 
{
    ...
    Queue::push(function($job) use ($data)
    {
        ...
        $job->delete();
    }
    return true;
}

有没有人找到防止并行行为并使其连续的方法?

非常感谢!

【问题讨论】:

    标签: php laravel queue ironmq


    【解决方案1】:

    推送队列自然会继续推送消息,无论工作是否完成,因为它们是 2 个独立的系统。其次,使用推送队列的目的是使其尽可能实时。

    IronMQ 特别是has retries,听起来,它将以指定的时间间隔(您设置)重试将消息推送到所需的端点 X 次(您设置) - 希望这将有助于解决您的问题。

    如果您希望仅在前一个作业完成后才处理作业,并且可以接受轻微延迟,那么我建议轮询队列并分批检索。

    【讨论】:

    • 我想轮询队列或使用 Iron Worker 是可行的方法,但我无法理解队列系统如何没有一次只有一个进程的选项...... . 重试不是解决方案,因为进程处理得很好,但有一些并发问题。谢谢你的回答!
    • 与延迟作业或应用内排队系统不同,推送队列不知道作业何时在服务器端完成。两者是独立的系统。
    【解决方案2】:

    你也可以尝试使用 IronMQ 类而不是 laravel Queue 类:

    $ironmq = new \IronMQ(array(
        'token' => Config::get('queue.connections.iron.token', 'xxx'),
        'project_id' => Config::get('queue.connections.iron.project', 'xxx')
    ));
    $ironmq->postMessage($queue_name, "Hello world");
    

    【讨论】:

    • 我没有看到 Laravel 和 IronMq 队列之间的区别,因为我在 config/queue.php 文件中将驱动程序设置为 IronMq。它是如何解决并发问题的?
    【解决方案3】:

    感谢您的回答,我决定使用 Beanstalkd 而不是 IronMQ。

    它更混乱,但它提供了所需的功能,我不依赖任何人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      • 2019-11-28
      相关资源
      最近更新 更多