2010-08-09 36 views
9

我需要構建一個非常計算密集的web服務,並且我正在努力弄清楚如何最好地繼續。如何構建一個計算密集型web服務?

我希望用戶連接到我的服務,在這一點上,一些計算完成了一段時間,通常少於60秒。用戶知道他們需要等待,所以這不是一個真正的問題。我的問題是,構建像這樣的服務的最佳方式是什麼,讓我頭痛得最少?我可以使用Node.js,web.py,CherryPy等?如果使用的話,我需要一個坐在這些部件前面的負載平衡器嗎?我不指望數量龐大的用戶,可能有數百或數千人。當然,我需要一些機器來承載這個數量的用戶,但這對我來說是一個未知的領域,如果有人能夠給我幾個指針或者可以閱讀的東西,那就太棒了。

謝謝。

回答

1

我認爲你可以根據自己的喜好來構建它,只要你可以使它成爲一個異步服務,以便用戶不必等待。

除非,當然,用戶不介意在這種情況下等待。

+0

因此,假設我採用基於node.js的方法,但後來決定在處理更多用戶的任務中需要投入更多計算機。我如何擴大規模? – user415614 2010-08-09 23:07:48

+1

通過從執行計算的機器中抽象出實際的服務調用。如果你可以使用node.js來做到這一點,很酷。如果不是,您可能需要選擇不同的機制。 – 2010-08-09 23:08:50

1

我推薦使用nginx的,因爲它可以處理重寫/ balancing/SSL等以最簡單的

6

我可以使用Node.js的,web.py,CherryPy的,等等?

是。選一個。 Django也很好。

如果使用的話,我需要一個坐在這些部件前面的負載平衡器嗎?

幾乎從不。

我需要多臺機器的這個號碼的用戶,

懷疑。

請記住,每個Web事務都有幾個不同的(幾乎不相關的)部分。

  1. 前端(Apache HTTPD或NGINX或類似的)接受初始Web請求。它可以處理服務靜態文件(.CSS,.JS,圖像等),所以你的主要Web應用程序是這樣整潔的。

  2. 合理高效的中間件如mod_wsgi可以管理數十個(或數百個)後端進程。

  3. 如果你選擇像celery一個聰明的後端處理組件,您應該能夠「真正的工作」分發到最小數量的處理器來完成這項工作。

  4. 結果通過mod_wsgi反饋到Apache HTTPD(或NGINX)到用戶的瀏覽器。

現在後端進程(由芹菜管理)與基本Web服務器脫離。您可以通過Apache HTTPD和mod_wsgi和celery實現大量的並行處理,從而可以使用每一處理器資源。此外,您可能能夠將「計算密集型」進程分解爲並行進程 - Unix管道非常高效並利用了所有可用資源。您必須將問題分解爲step1 | step2 | step3並使芹菜管理這些管道。

您可能會發現這種分解會導致比您原本想象的更大的工作量。

許多Python web框架將用戶的會話信息保存在一個公共數據庫中。這意味着,所有後端都可以 - 無需任何實際工作 - 將用戶的會話從Web服務器移動到Web服務器,從而實現無縫和自動的「負載平衡」。只需擁有大量產生Django(或web.py或其他)的HTTPD/NGINX前端,它們都共享一個公共數據庫。它工作得非常好。

+0

我同意使用芹菜或類似的後端排隊執行實際工作的工作。也就是說,不要在網絡服務器/應用程序中進行這項工作。如果有1000個待處理請求,我會調查可以觸發作業的web界面風格,然後立即向瀏覽器返回響應,Web界面觸發進一步請求以檢查進度。這是因爲WSGI阻塞類型接口由於所需的進程/線程資源而不適合長時間運行。如果希望請求等待,最好使用異步Web /應用程序服務器。 – 2010-08-10 02:16:32

+0

@Graham Dumpleton:準確地說。此外,我明白芹菜是這樣做的。 – 2010-08-10 02:21:28

0

如果你想讓你的網頁服務異步,你可以試試Twisted。它是面向異步任務並實現如此多網絡協議的框架。通過xml-rpc提供這種服務非常簡單(只需將xmlrpc_作爲方法的前綴)。另一方面,它與成千上萬的用戶一起擴展得非常好。

芹菜也是一個很好的選擇,使計算最密集的任務異步。它與Django很好地集成在一起。