【问题标题】:Can Resque run jobs in parallel?Resque 可以并行运行作业吗?
【发布时间】:2011-09-24 12:14:18
【问题描述】:

Resque 可以同时运行许多类似的作业吗?如果是这样,您将如何设置工作人员来执行此操作?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 redis resque


    【解决方案1】:

    我会看看Resque Pool gem,它可以很容易地为不同的队列设置多个工作人员。然后你可以按队列对类似的任务进行分组。

    如果您还没有使用进程监控工具,resque-pool 可以帮助您通过单个守护进程管理您的工作。它还为您提供了一些方法来监控您的员工正在发生的事情。此外,它还可以让您通过一个简单的 yaml 文件轻松更改每个队列运行的工作人员数量。

    【讨论】:

    • 这与 Dylan 的解决方案有何不同/更好?
    • resque-pool 有一个主守护进程,可以不断确保您配置的工作人员数量在运行。虽然 monit 或 god 也可以这样做,但 resque-pool 守护进程是加载您的环境然后分叉出父工作进程的东西。这意味着,如果您是 CoW 友好的 Ruby(例如 REE),您将看到相当可观的 RAM 节省,因为替换该进程仍将受益于共享内存。通过 monit 或 god 重新启动的进程将拥有引导环境的完整内存副本。
    【解决方案2】:

    如果将COUNT 选项传递给 rake 任务,则可以运行多个工作器:

    COUNT=5 QUEUE=* rake resque:workers
    

    在生产中,您可以使用 God 之类的东西来保持您的流程运行。 Resque 项目有一个sample configuration script,它允许多个工作人员。

    【讨论】:

    • 就这样?在排队工作时我是否需要做任何额外的事情,还是 Resque 会自动将每个工作委派给不同的工作人员?我还需要使用God 来管理这些并行作业还是需要额外的东西?
    • God 只是让您的流程在生产中运行的一种方式;绝对不是必需的。队列的本质是,每当添加新作业时,下一个可用的工作人员都会接受它。因此,如果您有 5 个工人和 5 个工作,每个工人将运行一个工作(不过,这是一个粗略的概括——我不熟悉 Resque 的内部结构,不知道他们如何具体处理这个问题——例如,如果第一个工人在分配第五个工作之前完成了它的工作,第一个工人可能会得到它而不是最后一个工人)。
    • 酷,谢谢。因此,如果我要同时运行大量类似的工作(我可能需要一次处理 1000 个工作),我是否应该启动大量工作人员?还是有更好的策略?
    • “所以如果你有 5 个工人和 5 个作业,每个工人将运行一个作业”,但不是并行的,一个接一个
    • @Luccas 对吗?如果你有 5 个工作,每个工作人员将并行运行 1 个,不是吗?
    【解决方案3】:

    如果您使用 monit 进行监控,请注意每个工作人员有一个 pid 文件

    #!/bin/sh
    cd <path of app>/current/
    for i in 3; 
    do
        VVERBOSE=1 PIDFILE=<path of app>/shared/pids/resque_$i.pid RAILS_ENV=production QUEUE=name_of_queue bundle exec rake environment resque:work > <path of app>/shared/log/resque_$i.log
    done
    

    【讨论】:

      猜你喜欢
      • 2013-12-05
      • 1970-01-01
      • 2013-12-04
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 2023-03-29
      • 2019-07-31
      相关资源
      最近更新 更多