2012-01-31 152 views
0

在編程語言中,特別是Java中,應該考慮哪些因素以確保應用程序具有可伸縮性?我們舉一個Web應用程序的例子,它可以同時爲1000個用戶提供服務,預計用戶可能會增長到100,000。另外假設目前只提供了特定的功能,並且將來我們可能需要添加更多功能,如報告等。我們是否需要確保某些類型的瓶頸不會發生,或者是否應該避免某些類型的設計,這可能會限制可伸縮性?應該考慮怎樣考慮可伸縮性

+4

這是一個非常廣泛的問題,高度依賴於上下文。提供更多關於什麼類型的應用程序的詳細信息,可能會給你有用的答案。 – kosa 2012-01-31 15:15:04

+0

編輯了問題陳述 – Gaurav 2012-01-31 15:22:44

回答

1

瓶頸是IO(磁盤,數據庫......)和網絡。編程語言並不是什麼大問題。

3
  1. 儘可能避免鎖,尤其是全局鎖。
  2. 靜態通常會導致鎖定看起來像個好主意,儘可能避免靜態的情況。他們也使測試更加困難。
  3. 您的數據如何存儲?你在使用Sql數據庫嗎?這將如何擴展?你可以使用NoSql數據存儲嗎?提示會計類型應用程序的答案是否定的,我們需要Sql的transacionality。
  4. 請注意拉型訂閱,具體取決於您的加載推送類型訂閱可以更好地擴展。例如10個消費者每秒鐘檢查一次狀態變化是沒有問題的,10000個消費者每秒檢查一次狀態變化更具挑戰性。如果數據每分鐘更改一次發佈效率更高,如果更頻繁地更改,則每秒1次發佈者可以選擇批量更改。
  5. 在你的架構圖中尋找星形,當星星中心的機器過載時會發生什麼?在很多情況下,這將是您的數據存儲區,並且大多數Sql數據庫的成本很高,難以擴展到只有大量只讀副本的讀/寫主機。如果情況確實如此,並且你知道你將會變得越來越大,那麼請儘早考慮分區(在多個讀/寫主分區上分割數據)。
  6. 緩存 - 是一個像Memcached一樣的共享緩存可以幫助您嗎? (通常不需要粘性會話)
  7. 儘早聘請專家來審查設計。
1

決定可擴展性對您意味着什麼。

每個應用程序都在某種意義上進行擴展,但「可擴展性」似乎只適用於缺乏在特定問題域中進行擴展的應用程序。您的問題域與我的問題域不同,因此如果我提供可伸縮性建議,則與在應用程序中實際未觀察到的用例優化相同。你現在認識到這是過早的優化(很多非常糟糕的系統設計選擇的根源)。

因此,要弄清楚什麼可能增長,什麼可能不增長,並把你的錢(和時間)放在你痛苦的地方。基準。衡量它。

一旦您瞭解您的應用程序可能無法擴展的感覺,請在嘗試解決該問題時進行一點研究。這樣你就不是完全靠自己,你可以利用大量的可擴展性工作,但爲你的特定情況。

請記住,要實現更好的可伸縮性,您必須在某個地方進行折衷。無論你的程序會在時間,內存,硬件要求或其他方面增長。如果您沒有關於處理時間,內存利用率等的性能指標,則您未滿足先決條件要求而擔心可伸縮性。

0

我想這是浪費時間和空間寫在這裏。我強烈建議您閱讀Scalability Rules,其價格便宜,寫得很好,寫得很好。