2016-02-09 63 views
1

在服務器端有很多方法來處理「多個」API請求。並行處理可以在這裏執行。 但我想知道一個API如何並行處理。 例如: 如果一個API請求執行方法say方法1。如何在服務器端的「單個」rails API上執行並行處理?

def method 1 
     ..... 
     ...... 
     ....... 
    end 

如果方法1是這可能需要很長的時間處理的長方法(包括多個環路和數據庫查詢),而不是順序地處理它,在那裏用於並行處理有一個範圍?

一種方法是使用resque創建後臺作業。但是有沒有其他方式可以做到這一點,如果有的話,應該如何編寫代碼來滿足要求。

是否有任何服務器端的方法來做到這不是特定於ruby?

回答

1

請注意,基於事件的服務器和後臺作業之間存在巨大差異。

基於事件的服務器通常在單個線程上運行,並對非阻塞IO使用回調。最着名的例子是Node.js.對於ruby來說,有eventmachine庫和各種框架以及簡單的HTTP服務器。

偶數服務器可以開始處理一個請求,然後切換到另一個請求,而第一個正在等待數據庫調用。

請注意,即使您有基於事件的服務器,處理請求的速度也不會很慢。用戶體驗將受到影響,客戶端將會斷開連接。

這就是後臺作業(工作人員)進來的地方,他們讓您的web進程快速完成,以便它可以發送響應並開始處理下一個請求。像發送電子郵件或清理這樣的緩慢流程不需要用戶反饋或併發性,這些流程就是爲工作人員提供的。

所以最後 - 如果你的應用程序很慢,那麼使用並行處理並不會節省你。它不是一顆銀彈。相反,您應該投資於優化數據庫查詢並利用緩存,以便快速響應。

儘管您可能在Rails中並行運行數據庫查詢或其他操作,但大大增加的複雜性可能不值得提升性能。

我的意思是,通常你在Rails中所做的併發不是真的適用 - 你從數據庫中獲取某些東西並使用它來創建JSON或HTML。無論如何你都無法真正開始渲染,直到你有結果。雖然您可能會執行諸如提取數據並使用它來併發渲染部分內容,但Rails並不支持這種方式,因爲它會大大增加複雜性,但不會爲框架的大多數用戶提供太多支持。

一如既往 - 不要過早優化。

+1

我可能混淆了併發性和並行性,但你明白了 - 如果你不想構建真正的巨大,平行和瘋狂的東西,去看Go,Erlang或Elixir。但是,在99%的Web應用程序中,您不需要併發處理單個Web請求。 – max

+0

感謝您的意見。我實際上做了db查詢的優化,所以只想知道是否還有其他可以完成的事情。我明白你的意思,這很有道理。再次感謝。 – Akshay

+0

您可能想要考慮使用反向代理,使用memcached/redis進行模型緩存以及使用電子標籤。 – max

相關問題