2011-07-08 24 views
1

如果将诸如调用外部服务(例如发送电子邮件)之类的任务发送到后台任务和工作人员以从主应用程序中删除耗时的任务,我不明白为什么使用Resis和Redis To Go是一个好主意。是不是Redis在外部服务中使用外部服务,在这种情况下,这不会破坏目的,因为在Redis To Go上存储队列的键/值将是不可预知的,并且可能会耗费时间?使用Resis和Redis来执行后台任务的要点

编辑

我感到困惑的原因是我没有设置任何工人,并产生队列(和明显的操作都在等待,因为没有工人)由Resque上的Redis To Go的。所以我假设这意味着最初的Redis To Go写入是由主线程完成的。

回答

5

使用后台工作者的主要原因是主线程不会与运行任务捆绑在一起。使用Resque,它允许任务在主线程之外执行。这有很多原因。最大的问题是,缓慢的操作不会导致主线程挂起,阻塞所有功能,直到请求完成。

Redis to Go只是一个远程Redis数据库。在您的主线程中,您可以执行修改500个键的操作。在本地数据库中,根本没有时间,但除非使用多命令,否则必须将每条命令发送到服务器并等待响应。好吧,如果它有一些命令,没有什么大不了的,但是在远程服务器上执行500次这样的操作需要花费大量的时间。以下是一些示例数字。本地执行操作需要5ms。在这里,不需要使用Resque,因为作业在本地快速执行。现在,使用Redis去,我们必须走出局域网。现在,每个操作需要5ms(0.005秒)。如果我们做了500个,.005 * 500是2.5秒。现在,这是用于查询数据库的2.5秒,并且在请求完成之前,主线程已被锁定。 (请注意,这些数字是完全随机的...他们可能会更高或更低)

现在,使用Resque,这些操作在后台完成。当您的主线程执行时,它会将作业添加到Resque。主线程将执行。 Resque现在将按照它们收到的顺序执行这些命令。现在,执行可能需要2.5秒,但这2.5秒不能保持主线程。

+0

我很困惑,因为我没有设置任何工作人员,队列生成(显然操作正在等待,因为没有工人)通过恢复redis去。所以我认为这意味着最初的redis去写是由主线程完成的。 – sthapit