本文內容僅針對互聯網後臺開發從業人員。java
互聯網後臺開發,一般意味着分佈式、大數據,涉及到高性能、系統容災、數據容災、高可用性、數據一致性等。自從2008年Hadoop在華夏大地蓬勃發展,開源如火山爆發在業界百花齊放,茁壯成長。國內的BAT、華爲和小米等也大量的參與了國際開源,甚至開源了大量優秀的久經考驗的內部系統,如阿里的Tair、druid、fastjson、jstorm、AliSQL、RocketMQ和騰訊的RapidJSON、libco、PhxPaxos、PhxRPC、PhxQueue、PhxSQL、PaxosStore、MSEC、Tars、TAF等。git
開源如此繁榮,須要感謝Google的三篇論文:《The Google File System》、《MapReduce: Simplified Data Processing on Large Clusters》和《Bigtable: A Distributed Storage System for Structured Data》,Google開源的Protocol buffers等對整個業界做用也十分巨大。github
提到Google的三篇論文,就不得不得Hadoop,感謝Hadoop之父Doug Cutting,今天的大繁榮好象一切均源處於Hadoop,雖然以前已經有了Lucene和Nutch,但蓬勃發展仍是從Hadoop開始的,以後就一發不可收拾。同時,Yahoo、Facebook和Twitter是始做俑者,他們不但深度參與了Hadoop自己的研發,還貢獻了早期的生態成員HBase、Hive、Zookeeper、Pig、Cassandra、Thrift等,基於Hadoop的創業公司Hortonworks、MapR和Cloudera也是功不可沒。golang
象協程技術、GO語言、Rust語言、Scala語言、Closure也跟着快速發展,甚至古老的C++語言在短短几年也從98標準快速進化到了C++17標準。Java語言也是在快速進化,同時大量大數據系統的實現語言爲Java,讓你們見證了Java程序的性能。Docker、Kubernetes(簡稱k8s)等的繁榮帶動了GO語言走進各大小公司,Thrift、gRPC、RESTful等也帶動了多語言混合編程,以及微服務的發展。源自於美軍的「大中臺」,在阿里的帶動下漸爲衆人所知。新興事物Service Mesh(服務網格)也逐漸被愈來愈多的人所認識。redis
做爲互聯網後臺開發大軍中的一員,面對如此衆多的設施,可能會無所適從,有所迷茫。咱們應當如此去治理本身的知識體驗,以在激烈的競爭中爭取到優點。一我的的精力是有限的,不可能全通,只能儘量花最少時間掌握更多更基礎的部分。下表中是編程開發須要掌握的:算法
|
推薦理由sql |
學習建議mongodb |
Redisdocker |
相對簡單,但十分地管用apache |
1) 掌握Redis的實現原理,清楚它的架構(十分值得借鑑); 2) 熟悉它的核心配置項; 3) 瞭解它的主備選舉; 4) 瞭解它的AOF和RDB機制; 5) 掌握它的Module編程。 |
安裝和部署難度低,在分佈式中十分有用的東西,相關的有etcd。 |
1) 至少大體瞭解Paxos算法和Raft算法; 2) 會安裝和部署Zookeeper; 3) 會用它作配置服務; 4) 會用它作服務發現; 5) 會用它作服務Master的選舉; 6) 可不深度瞭解Zookeeper的實現,大部分人對算法會有些頭大,因此側重在應用上。 |
|
業務間和業務流程解耦的核心,對提高開發效率和下降系統複雜度十分管用, |
1) 瞭解它的實現原理和系統架構; 2) 熟練掌握Kafka的安裝和部署; 3) 熟悉核心配置項; 4) 可以基於它編程; 5) 至少會一種Kafka管理軟件,如KafkaManager等; 6) 競品Pulsar最好也有所瞭解。 |
|
它是不少的基礎,特別是其中的HDFS和YARN、其中的MapReduce由於低效率,應用愈來愈少,Spark、Flink等逐步替代了MapReduce |
1) 熟悉它的實現原理和系統架構(十分值得借鑑); 2) 掌握Hadoop的安裝和部署; 3) 掌握HDFS經常使用命令; 4) 掌握HDFS編程。 |
|
NoSQL的典型表明,十分適合流水類數據的存儲,和Redis不是同一類,相對複雜太多,但流水類數據用它來作存儲再合適不過了。能夠和Redis相結合,實現海量的高性能高可用流水服務。 |
1) 熟悉它的實現原理和系統架構(十分值得借鑑); 2) 掌握HBase的安裝和部署; 3) 掌握HBase經常使用命令; 4) 掌握HBase編程。 |
|
Hive的SQL界面大大簡化了對大數據的使用,但它實際只是一層殼,低層的計算引擎依賴Mapreduce、Tez和Spark等,注意官方已代表將來版本可能無警告方式不支持Mapreduce這種低效的計算引擎。 |
1) 熟悉它的使用; 2) 可以瞭解些SQL解析會更佳,推薦經典入門書籍《flex與bison》。 |
|
天生集實時(流式)計算和離線計算與一體,不論是實時計算仍是離線計算都值得掌握的利器。 |
1) 熟悉它的實現原理和系統架構; 2) 掌握它的安裝和部署; 3) 掌握Flink實時計算編程; 4) 掌握Flink離線計算編程; 5) 若有精力,實時計算前輩Storm也可瞭解下。 |
|
不但和Flink同類,仍是競品,因早Flink出生,生態相對好一些,但實時計算不如Flink。 |
Flink和Spark可只掌握其中一個,若有精力建議都有所瞭解。 |
|
監控的不二之選,僅爲Web展示,實際使用需配合InfluxDB或Prometheus等。 |
1) 會用便可
|
|
日誌的分析和管理再好不過的東西,ELK實際對應三個不一樣組件:Elasticsearch、Logstash和Kibana。 |
1) 會用便可 |
|
被普遍使用的可擴展的高性能序列化最好的選擇 |
1) 會用便可; 2) 瞭解實現原理。 |
|
應用十分普遍的開源RPC,Wireshark都支持它,能夠幫助快速開發各類服務。自己無線程級對象,因此應用本身藉助GCC的「__thread」或C++的「thread_local」。 |
1) 會用; 2) 瞭解實現原理; 3) 會定位相關問題。 |
|
gRPC和Thrift至少要掌握其中一個,建議至少掌握Thrift,雖而後起的gRPC更爲優秀,但Thrift應用得更爲普遍,支持的語言也更廣,C++98標準環境也能用。 |
1) 會用; 2) 瞭解實現原理; 3) 會定位相關問題。 |
|
雲時代不得不會的東西 |
1) 瞭解其原理和架構; 2) 掌握它的使用。 |
|
會Docker,那麼必然要知道一樣採用GO語言開發的Kubernetes,和Docker相關的還包括Mesos。 |
1) 至少初步瞭解 |
|
處於AI時代,即便未從事AI相關的開發工做,那也應當要沾點邊,那麼TensorFlow幾乎是不二選。 |
1) 初步瞭解; 2) 會簡單使用 |
|
GO語言 |
大數據雲時代光會C/C++不夠 |
1) 熟練掌握 |
Java語言 |
大數據雲時代光會C/C++不夠,除C/C++外,Go和java至少還要熟練掌握一門,最好兩個都熟,況且開源的大部分是Java或Java類語言實現的。 |
1) 熟練掌握 |
Google開源的構建(編譯)工具,支持C/C++、Java、Go等 |
1) 熟練掌握Bazel的使用 |
除了掌握上面列出的外,還應知道、瞭解或熟悉如下概念或知識點:
1) ACID
2) CAP
3) BASE
4) 一致性、弱一致性、最終一致性、強一致性、一致性哈希
5) 拜占庭將將軍問題(Byzantine Generals Problem)、拜占庭容錯技術(Byzantine Fault Tolerance,BFT)、實用拜占庭容錯算法(Practical Byzantine Fault Tolerance,PBFT)
6) PaxOS、Raft
7) WAL(Write-Ahead-Logging,參考:HBase)
8) LSM(Log-Structured Merge Tree,參考LevelDB)
9) 主從架構、弱主架構、去中心化架構
10) 數據脫敏、數據安全、數據防篡改、數據簽名
11) 數據對帳、數據補嘗、數據審計、數據跟蹤
12) 災備、災難恢復、數據遷移、數據快照
13) 熱升級、無縫升級、無縫切換
14) 協程、微服務、大中臺、ServiceMesh
15) 雙活、多活、異地多活
16) 跨集羣容災、跨機房容災、跨地域容災
17) 跨集羣數據複製、跨機房數據復、跨地域數據復
18) 實時監控、實時告警、秒級監控、秒級預警
19) 接口或服務調用統計、調用鏈跟蹤
20) 服務降級、有損服務、柔性事務
21) 分佈式頻控、秒殺活動
22) 全鏈路(在線)壓測、削峯、波動、抖動、毛刺
23) 單機事務、多機事務、分佈式事務、兩階段提交、三階段提交、Quorum(NRW)、分佈式事務XA(事務管理器、資源管理器)、事務消息、REDO日誌、UNDO日誌、Checkpoint
24) HTTPS原理(區塊鏈)、MD五、SHA、RSA、Base64等算法、摘要(Digest)、共識算法、工做量證實(Proof-of-Work,PoW)、權益證實(Proof of Stake,PoS)、股份受權證實(Delegated Proof of Stake,DPoS)
25) 就近計算、移動計算、網絡延遲、網絡測速
26) 服務部署策略(靠近哪端部署)、DevOps
27) 服務去狀態化、服務弱狀態化、服務無狀態化
28) 數據水平拆分、數據垂直拆分
可業餘瞭解的新興語言:
|
說明 |
官網 |
Kotlin |
現代多平臺應用的靜態編程語言,由JetBrains(Java IDE IntelliJ的提供商)開發。能夠編譯成Java字節碼,也能夠編譯成JavaScript,方便在沒有JVM的設備上運行,爲Android官方支持開發語言。比Java更安全,可以靜態檢測常見的陷阱,被稱之爲Android世界的Swift。 |
|
Julia |
集Python、C++和R爲一體,面向科學計算的高性能動態高級程序設計語言,可用於天文圖像分析、自動駕駛汽車、機器人、3D打印、精準醫療、加強現實、基因組學、風險管理等,主要應用於數據可視化、通用計算、數據科學、機器學習、科學領域、並行計算六大領域。 |
|
Rockstar |
圖靈完備的能寫出詩歌般代碼的動態編程語言,用它寫下的不只僅是一行行可執行的代碼,仍是一首青春的讚美語——就像是它的名字同樣,搖滾明星。 |
|
Rust |
由Mozilla研究室主導開發的一門現代系統編程語言,Rust是一種系統編程語言,它有着驚人的運行速度,可以防止段錯誤,並保證線程安全。 |
總結:會用Thrift或gRPC開發各類服務(Service),數據採用可擴展的Protobuf格式,性能要求特別高的服務,能夠考慮基於Seastar,順即可以瞭解下Scylladb和TiDB(技術粉絲對牛逼的東西總迫於瞭解)。若是服務的本地狀態數據多且複雜,能夠考慮採用SQLite存儲。用Flink作實時計算,數據經過Kafka流入Flink,結果緩存到Redis,歸檔到HBase或快照到HDFS。使用Zookeeper作配置分發和服務的主從切換,以及服務發現。用Hive作離線數據的統計,引擎使用Spark,結果數據存Redis、HBase、PostgreSQL、MongoDB等。服務的日誌接入ELK,服務的監控藉助InfluxDB和Prometheus接入Grafana。服務的打包、分發和部署採用Docker,使用Kubernetes作管理。業餘時間學習下TensorFlow,完成機器學習的入門。若是我是C/C++開發者,相對獨立非核心的服務會考慮用GO語言開發,以逐步掌握GO語言編程,但若是服務須要訪問相似HBase這樣的,只有原生Java接口的系統,則會考慮採用Java開發。但核心的仍然採用C++開發,但儘可能升級編譯器支持C++17標準,至少要支持C++11標準,以提高開發效率。
附1:技術博客
https://blog.csdn.net/Aquester(CSDN) http://aquester.blog.chinaunix.net(ChinaUnix)
附2:《大數據利器2018版.xls》
附3:與編程語言無關的書籍
附4:C/C++經典書籍
附5:進階書籍
附6:其它