2012-01-20 99 views
10

我在考慮用Rails編寫Web應用程序。用戶所做的每個請求都將取決於被調用的外部API。這個外部API可能會非常慢(2-3秒),顯然這會影響個別請求。阻止IO/Ruby on Rails

在此期間,當代碼正在等待外部API返回時,是否會阻止進一步的用戶請求?

只是爲了進一步澄清似乎有一些混亂,這是我期待的型號:

  1. 愛麗絲使請求我的web應用程序。爲了實現這一點,需要調用API服務器A. API服務器A速度較慢,需要3秒才能完成。
  2. 期間,當Rails應用程序在調用API服務器A這個等待時間,鮑勃使得其具有做出API服務器B.請求

是Ruby(1.9.3)解釋(請求或東西在Rails 3.x框架中)會阻止Bob的請求,要求他等待Alice的請求完成?

+0

其實我有類似的問題,但我只是想知道,你是否通過activerecord從你的Rails應用程序進行數據庫查詢,或者數據是純粹從後端API服務器驅動的,它使數據庫查詢並將結果返回給你導軌前端? –

+0

@BennyTjia Both。個別請求將使用本地存儲的數據和由API服務器返回的唯一數據。 – Matty

回答

7

如果您只使用一個單線程,非均衡服務器(或者不要使用偶數服務器使用均衡I/O),那麼是的。在使用ThinEM-Synchrony的其他解決方案中將避免這種情況。

詮,根據您的更新:

沒有,既不紅寶石也不Rails的是要引起你的應用程序來阻止。但是你遺漏了那部分,即:Web服務器。您可能需要多個進程,多個線程,或者一個偶數服務器,以及使用一個偶數I/O庫來執行您的Web服務請求。

@alexd使用多個進程描述。我個人喜歡一個平坦的服務器,因爲我不需要提前知道/猜測我可能擁有多少個併發請求(或者使用某些可以根據負載加快進程速度的東西)。單個進程面向單個thin進程可以服務噸的並行請求。

+1

他仍然會遇到網絡延遲。 –

+3

_Network_延遲?如果你的意思是當前的用戶將被迫等待,當然他們會(但我從他寫這個問題的方式假設,這是不可避免的)。我讀到的問題不是爲了避免用戶觸及外部服務的延遲,而是爲了阻止其他併發請求。 – smparkes

+0

@smparkes我對這個問題進一步澄清了 – Matty

0

很可能,是的。很明顯,有很多方法可以解決這個問題,但它們都不容易。

更好的問題是,爲什麼你需要在每個請求上點擊外部API?爲什麼不在你的Rails應用程序和外部API之間實現一個緩存層,並將它用於大多數請求?

通過這種方式,使用一些用於過期緩存的自定義邏輯,您將擁有一個快速的Rails應用程序,並且仍然能夠利用外部API服務。

+0

返回的數據隨每個請求而變化。因此緩存是不可能的。 – Matty

+0

那麼,你說的是你的API是你的數據庫?從長遠來看,這聽起來不太可行...... –

+0

該API不作爲數據庫使用。 – Matty

3

您的問題的答案取決於您的Rails應用程序正在運行的服務器。你現在在用什麼?瘦?獨角獸?阿帕奇+乘客?

我全心全意地爲您的情況推薦Unicorn - 它可以非常容易地並行運行多個服務器進程,並且您可以通過更改配置文件中的數字來配置並行進程的數量。當一名獨角獸工作人員處理Alice的高延遲請求時,另一名Unicorn工作人員可以使用您的空閒CPU週期來處理Bob的請求。