在处理许多用户时实际使用延迟后台作业

时间:2011-05-02 16:01:35

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

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

这是我不确定我做对的部分。我说的是相同的作业,但是每个用户都是单独的。这算作每个用户的工作吗?如果我有100个用户,我是否需要为每个用户保留100名工作人员以免被束缚?

我尝试使用delayed_job来模拟它,当我使用其他帐户登录时,我必须等到其他用户的电子邮件发送到我的电子邮箱。虽然插件使用起来很快捷,但我认为这不是正确的方法。

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

您可以使用此方法:

  1. 将您的任务分组到对其优先级有意义的队列中。如果您需要快速响应时间,请在“前台”队列中使用它。慢? (如发送/接收电子邮件)可以在“后台”队列中
  2. 每个用户都有一个队列(你需要有很多工作人员)
  3. 这个问题也提供了use delayed_jobs with multiple queues/tables

    的方法