淺析分佈式

 我接觸分佈式系統有段時間了,也算小有心得,下面從what,why,who,when和how幾方面來分別討論!

1,what:分佈式是什麼?相對於把所有服務,功能在一臺機器(或者一個集羣)進行統一部署的集成系統,分佈式採用了拆分的方式,將不同的服務部署在不同的節點上,彼此之間通過某種方式進行通信,對外表現出高度透明和內聚性,讓使用者感覺到是一個統一的整體!

2,why:爲什麼要使用分佈式?①集成系統代碼耦合嚴重,難以擴展②而且隨着業務需求越來越多,就算是使用集羣也很難達到高併發,低延遲的要求③集成系統對於單個服務器的要求很高,很容易出現內存溢出,CPU佔滿的情況!使用分佈式系統能將服務粒度變小,防止業務耦合,同時對於單個服務水平擴展更加容易!


3,who和when:什麼場景該使用分佈式呢?在單一系統無法滿足性能需求的時候(阿里巴巴雙十一幾十億的訪問可不是蓋的,是幾萬臺服務器堆起來的),在業務耦合太嚴重的時候,都應該考慮將集成系統拆成分佈式系統,通常來說所有公司都可以使用分佈式系統,但是涉及到更多的開發資源,更多的運維成本,所以小公司可以選擇使用!


4,how:怎麼玩轉分佈式?先來看下JAVA中有哪些涉及分佈式的技術,首先需要拆分服務,所以需要微服務架構(springcloud和dubbo),服務之間相互調用使用rpc或者服務註冊與發現中心(eureka,zookeeper),如果服務異常了,需要進行熔斷,防止雪崩(hystrix等),服務之間要通信,所以需要消息隊列保證數據傳輸(redis,kafka,activemq等),數據庫性能跟不上,需要進行分庫分表(多臺數據庫分佈在不同的服務器節點上),業務代碼連接分庫分表的數據庫需要通過中間件服務(mycat,sharding-jdbc等),高併發,秒殺系統,數據庫IO速度還是跟不上,就不得不引入緩存(redis,memcache等),數據庫之間或者和緩存之間不可避免的需要進行數據同步(canal等),單個服務如果還有性能問題,可以使用反向代理和負載均衡(nginx等)!

總之,分佈式技術不是簡簡單單的一門技術,而是涉及到服務的拆分,服務的通信,服務的相互調用等一系列的高難度問題!






同時,由於系統是分佈的,對於分佈式事務(使用TCC,多階段提交等方式保證數據一致性),分佈式緩存,分佈式消息隊列,分佈式鎖,數據一致性,消息丟失,全局唯一ID等問題都是迫切需要注意的難點!


具體的分佈式實現不是三言兩語就能說清的,一定要在實際的項目中多加實踐,才能深切的掌握這項技術,更多在項目實操上遇到的問題,可以聯繫筆者進行研究討論,更多技術分享,敬請關注。。。


創建於2018.5.21
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章