2011-07-08 64 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