PHP中文网2017-04-18 09:41:50
首先,要了解系統為什麼要使用分佈式。
隨著網路的發展,傳統單工程專案的許多效能瓶頸越發凸顯,效能瓶頸可以有幾個面向。
一、應用服務層:隨著用戶量的增加,並發量增加,單一項目難以承受如此大的並發請求所導致的效能瓶頸。
二、底層資料庫層:隨著業務的發展,資料庫壓力越來越大,導致的效能瓶頸。
針對上面兩點,我覺得可以從兩方面解決。
應用服務層:
應用服務層的解決方案有幾種:
應用系統集群:
應用系統集群最簡單的就是伺服器集群,例如:tomcat集群。應用系統叢集的時候,比較凸顯的問題是session共享,session共享我們一是可以透過伺服器插件來解決。另外一種也可以透過redis等中間件實現。
服務化拆分:
服務化拆分,是目前非常火熱的一種方式。現在都在提微服務話。透過傳統專案進行服務化拆分,達到服務獨立解耦,單服務又可以橫向擴容。服務化拆分遇到的經典問題就是分散式事務問題。目前,比較常用的分散式事務解決方案有幾種:訊息最終一致性、TCC補償型事務、盡最大能里通知。具體的你可以參考下這篇部落格分散式事務解決方案
底層資料庫層:
如果系統的效能壓力出現在資料庫,那我們就可以讀寫分離、分庫分錶等方案來解決,由於這方面我的經驗也不夠多,所以,你可以參考下其他的一些文獻。
Mycat 資料庫分庫分錶中間件
MySQL高可用讀寫分離叢集
PHP中文网2017-04-18 09:41:50
謝邀,不是大神,而且感覺題主問的問題好大,不太好回答。
不過據我了解,技術面試一般都是層層漸進,面試官試探候選人技術體系的深度,所以說理論上在一個話題上聊的越多,越代表候選人的能力越優秀。許多高併發和分佈式的處理問題其實都是經驗問題,因為不同業務場景不同資料量的高並發處理情況完全不同,並沒有完全通用的解決方案。
所以面試的時候,理解面試官描述的業務場景非常重要,這也是分析性能瓶頸的關鍵信息,根據木桶原理,肯定在某一個關鍵點存在瓶頸。
舉個簡單例子,隨著業務成長,一個直連資料庫的伺服器叢集遇到了效能瓶頸,該怎麼解決?
這個時候你要先分析效能瓶頸出在哪裡,首先,要考慮資料庫本身的設計是否合理,索引是否起到了作用,分析SQL執行計劃,是否可以把資料庫進行水平拆分或垂直拆分來分攤壓力。
進而要分析能否使用分散式的讀寫分離資料庫,引發怎麼進行資料同步,資料分發的問題等等。
資料庫層分析完後,在應用層也可以分析,一般是透過快取來提高查詢效能,涉及快取的命中率問題,快取的更新問題,快取的多節點 hash 問題等等。
總得來說,要搞清楚業務場景,然後針對某個具體的問題,去嘗試提出解決方案。例如新浪微博,是採用推模式還是拉模式?如果是推模式的話,一個幾千萬粉的大v發條微博,是不是要給這幾千萬人推?如果是拉取模式,一個人關注的用戶多了每次拉取的時候會不會出現效能問題?
伊谢尔伦2017-04-18 09:41:50
分散式有很多種,例如你把你的專案分成了多個模組,每個模組一個jvm 透過rpc呼叫來完成整體的工作,這是分散式,例如你redis單一無法抗那麼多並發或無法有這麼多內存做緩存,可以做redis集群,這也是分佈式,再比如,你的數據庫單台無法滿足你現在的數據量或者並發量,那麼分庫分錶,通過jta實現事務這也是分佈式,再加上什麼日誌同步,負載平衡,加上hdfs儲存資料備份,儲存日誌,加上eslaticsearch 分析搜尋日誌都可以談。
PHP中文网2017-04-18 09:41:50
別人掏出一個籠統的問題,回答者如果跟著籠統,就掛啦···建議回答的時候要有邏輯。
如果是我,我會2種做法:
1.找一個我之前做過的項目,跟他討論瓶頸,然後再引出理論知識,最後給出解決方案。這種做法容易出現自己講自己的,最好和麵試官有些互動。重視面試官的在談話過程中的疑問,審清楚面試官問的是什麼
2.第二種做法就是先攤牌,把比較經典的分散式問題拿出來,例如流量的負載。事務的保證。 。 。 。然後就問題給出業務場景。