【问题标题】:Practical use of delayed background job when dealing with many users处理大量用户时延迟后台作业的实际使用
【发布时间】:2011-08-17 02:13:15
【问题描述】:

当后台作业开始时,它被发送到一个工作人员处理它的队列的后面;一个任务清除,另一个开始。我想我做对了,只是在某些情况下我不了解它的实际方面。当然,如果您是一家公司,使用延迟工作每周发送 15,000 份时事通讯是非常合理的。但是,如果您有一个甚至 100 个用户的应用程序,其中某些任务的时间足够长,需要后台工作(例如发送/获取可能需要一分钟的电子邮件),那么每个用户将不得不排队等待另一个用户被清除(在如果只有一个工人)。

这是我不确定我是否正确的部分。我说的是相同的工作,但每个用户都是单独的。这算作每个用户的工作吗?如果我有 100 个用户,我是否需要为每个人的流程保留 100 个工人才能不被束缚?

我已经尝试使用delayed_job 来模拟这一点,实际上,当我使用不同的帐户登录时,我必须等到另一个用户的电子邮件被发送,直到我的电子邮件被发送。虽然该插件快速且易于使用,但我认为这不是正确的方法。

我也尝试过使用 Ajax,但由于它是一个 HTTP 请求,它会将浏览器捆绑在加载模式中,直到它从服务器获得响应(即使是 async: true)。不确定我是否太快排除了这个,但我有点在寻找更优雅的服务器解决方案。

有没有办法实现这样的后台工作? (我听说过不同的,主要是商业解决方案承诺很少的等待时间,但我有兴趣完全消除用户之间的队列)。如果没有,是否有一种方法可以在不等待响应的情况下发出 ajax 请求?我意识到我的问题都截然不同,但似乎都是解决这个问题的合适方法。

【问题讨论】:

    标签: ruby-on-rails ajax background queue delayed-job


    【解决方案1】:

    Resque是一个后台处理引擎,可以支持多队列。

    你可以使用它的方式:

    1. 将您的任务分组到对其优先级有意义的队列中。如果您需要快速响应时间,请在“前台”队列中使用它。慢? (如发送/接收电子邮件)可以在“后台”队列中
    2. 每个用户有一个队列(为此您需要有许多工作人员)

    这个 SO 问题也给use delayed_jobs with multiple queues/tables提供了一种方法

    【讨论】:

    • 感谢来源。 Resque 似乎比我现在需要的要重一点,尤其是安装 redis 等开销的 b/c。我一直在使用 delay_job 就像我说的那样并且很喜欢它,所以使用 dj 的多个队列可能会成功.
    【解决方案2】:

    delayed_job 和其他消息队列的目的是异步处理核心应用程序之外的作业。我总是使用队列来发送电子邮件,因为我依赖外部应用程序(有时是第三方 API,如 gmail)来发送它们,我无法保证可用和运行效率。

    因此,对于您的用例,即使用户很少,我也强烈建议您将电子邮件卸载到 delay_job。这将加速你的前端(ajax),也会让你在失败时重试。您可以启动多个工作人员来处理队列,但您的号码不应该是必要的,除非您发送邮件的呼叫需要很长时间(超过几秒钟?)。

    是的,在大多数情况下,即使消息可能相同,我也会为每个用户创建单独的作业。唯一一次我会一起处理它们是电子邮件应用程序/API 具有批量发送功能,您可以通过在几次调用中发送大量有效负载来显着减少调用次数。

    【讨论】:

    • 我正在发送和接收电子邮件。 IE。这大约需要一分钟,这就是为什么我一直在寻找一种既便宜又不会让用户排队的解决方案。
    • 你能把发送和接收分开来分开工作吗?每个工作 1 分钟似乎真的很长。尝试多种 DJ 流程,直到您对表演感到满意为止。听起来您正在寻找多线程解决方案,但这在 Ruby 中实际上有点复杂。多进程(多个 DJ 工作人员)解决方案应该可以正常工作。另外,我认为您可能对 Queue 的含义有些困惑。队列本身并不慢。您所做的只是将工作发送到异步进程,以便您可以立即响应您的用户(http 响应)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2014-09-15
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    相关资源
    最近更新 更多