前一段時間在網上看見了一篇文章內容大致是作爲一個架構師你需要擁有什麼樣的能力,其中不過是包括以下幾個點:
1、對於Java基礎技術體系(包括JVM、類裝載機制、多線程併發、IO、網絡)有一定的掌握和應用經驗。
2、對面向對象的軟件開發思想有清晰的認識、熟悉掌握常用的設計模式;
3、熟練掌握目前流行開源框架(spring/springmvc/ibatis),並且對其核心思想、實現原理有一定認知;
4、熟悉Oracle、MySQL等數據庫開發與設計以及緩存系統REDIS或 Memcached的設計和研發;
5、熟悉底層中間件、分佈式技術(包括緩存、消息系統、熱部署、JMX等)
6、至少一種Java應用服務器如tomcat
7、精通shell編程,熟練應用awk、sed、grep、strace、tcudump、gdb等常用命令;
8、有大型分佈式、高併發、高負載(大數據量)、高可用性系統設計開發經驗
9、對配置管理和敏捷研發模式有所瞭解
10、業務能力
當然以上的十點都是一個高級架構所應該掌握的或者說已經有擁有的能力,而就算我們知道架構師需要這樣的能力了,其實離架構師的階段還差很遠,就像你高考的時候知道要考數理化,政史地。我們知道這些是考試的科目,而如何去得到這些東西或者去如何應對高考中的每個知識點,所以知道應該要掌握技術的方向之後當然就是去學習裏面的具體知識;
下面我就以分佈式架構這個專題來介紹下需要哪些具體的知識點,你又如何來獲得這些知識點;
一,通信
既然是分佈式系統,系統間通信的技術就不可避免的要掌握。
首先要掌握一些基礎知識,例如網絡通信協議(諸如TCP/UDP等等)、網絡IO(Blocking-IO,NonBlocking-IO、Asyn-IO)、網卡(多隊列等);更偏應用的層面,需要了解例如連接複用、序列化/反序列化、RPC、負載均衡等。
通信連接方式:
大量的連接通常會有兩種方式:
1.大量client連一個server
在現如今NonBlocking-IO這麼成熟的情況下,一個支持大量client的server已經不那麼難寫了。
有一個點要特別注意,就是當server掛掉的時候,不能出現所有client都在一個時間點發起重連,那樣基本就是災難。
通常可以採用的方法是client重連前都做隨機時間的sleep,另外就是重連的間隔採取避讓算法。
二,伸縮性
分佈式系統基本就意味着規模不小了,對於這類系統在設計的時候必須考慮伸縮性問題,架構圖上畫的任何一個點,如果請求量或者是數據量不斷增大,怎麼做到可以通過加機器的方式來解決,當然,這個過程也不用考慮無限大的場景,如果經歷過從比較小到非常大規模的架構師,顯然優勢是不小的,同樣也會是越來越稀缺的。
伸縮性的問題圍繞着以下兩種場景在解決:
1.無狀態場景
無狀態場景通常會把很多狀態放在db,當量到一定階段後會需要引入服務化,去緩解對db連接數太多的情況。
2.有狀態場景
所謂狀態其實就是數據,通常採用Sharding來實現伸縮性,Sharding有多種的實現方式,常見的有這麼一些:
2.1規則Sharding
2.2一致性Hash
2.3Auto ShardingAuto Sharding的好處是基本上不用管數據搬遷,而且隨着量上漲加機器就OK,但通常Auto Sharding的情況下對如何使用會有比較高的要求,
而這個通常也就會造成一些限制,這種方案例如HBase。
2.4CopyCopy這種常見於讀遠多於寫的情況,實現起來又會有最終一致的方案和全局一致的方案,最終一致的多數可通過消息機制等,
全局一致的例如zookeeper/etcd之類的,既要全局一致又要做到很高的寫支撐能力就很難實現了。
三,穩定性
作爲分佈式系統,必須要考慮清楚整個系統中任何一個點掛掉應該怎麼處理(到了一定機器規模,每天掛掉一些機器很正常),同樣主要還是分成了無狀態和有狀態:
1.無狀態場景對於無狀態場景,通常好辦,只用節點發現的機制上具備心跳等檢測機制就OK,經驗上來說無非就是純粹靠4層的檢測對業務不太夠,通常得做成7層的,當然,做成7層的就得處理好規模大了後的問題
2.有狀態場景全局一致類型的場景中,如果一臺掛了,就通常意味着得有選舉機制來決定其他機器哪臺成爲主,常見的例如基於paxos的實現。可維護性整個系統環境應該怎麼搭建,部署,配套的維護工具、監控點、報警點、問題定位、問題處理策略等等。
四,可維護性
維護性是很容易被遺漏的部分,但對分佈式系統來說其實是很重要的部分,例如整個系統環境應該怎麼搭建,部署,配套的維護工具、監控點、報警點、問題定位、問題處理策略等等。
以上就是我的分享,看完的朋友記得點贊噢!想學習更多的Java技術方面的知識的朋友們,可以進我的Java高級架構師交流羣,裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料,羣號:680075317,也可以進羣一起交流,比如遇到技術瓶頸、面試不過的,大家一些交流學習!