本文內容僅針對互聯網后台開發從業人員。
互聯網后台開發,通常意味着分布式、大數據,涉及到高性能、系統容災、數據容災、高可用性、數據一致性等。自從2008年Hadoop在華夏大地蓬勃發展,開源如火山爆發在業界百花齊放,茁壯成長。國內的BAT、華為和小米等也大量的參與了國際開源,甚至開源了大量優秀的久經考驗的內部系統,如阿里的Tair、druid、fastjson、jstorm、AliSQL、RocketMQ和騰訊的RapidJSON、libco、PhxPaxos、PhxRPC、PhxQueue、PhxSQL、PaxosStore、MSEC、Tars、TAF等。
開源如此繁榮,需要感謝Google的三篇論文:《The Google File System》、《MapReduce: Simplified Data Processing on Large Clusters》和《Bigtable: A Distributed Storage System for Structured Data》,Google開源的Protocol buffers等對整個業界作用也十分巨大。
提到Google的三篇論文,就不得不得Hadoop,感謝Hadoop之父Doug Cutting,今天的大繁榮好象一切均源處於Hadoop,雖然之前已經有了Lucene和Nutch,但蓬勃發展還是從Hadoop開始的,之后就一發不可收拾。同時,Yahoo、Facebook和Twitter是始作俑者,他們不但深度參與了Hadoop本身的研發,還貢獻了早期的生態成員HBase、Hive、Zookeeper、Pig、Cassandra、Thrift等,基於Hadoop的創業公司Hortonworks、MapR和Cloudera也是功不可沒。
象協程技術、GO語言、Rust語言、Scala語言、Closure也跟着快速發展,甚至古老的C++語言在短短幾年也從98標准快速進化到了C++17標准。Java語言也是在快速進化,同時大量大數據系統的實現語言為Java,讓大家見證了Java程序的性能。Docker、Kubernetes(簡稱k8s)等的繁榮帶動了GO語言走進各大小公司,Thrift、gRPC、RESTful等也帶動了多語言混合編程,以及微服務的發展。源自於美軍的“大中台”,在阿里的帶動下漸為眾人所知。新興事物Service Mesh(服務網格)也逐漸被越來越多的人所認識。
作為互聯網后台開發大軍中的一員,面對如此眾多的設施,可能會無所適從,有所迷茫。我們應當如此去治理自己的知識體驗,以在激烈的競爭中爭取到優勢。一個人的精力是有限的,不可能全通,只能盡可能花最少時間掌握更多更基礎的部分。下表中是編程開發需要掌握的:
|
推薦理由 |
學習建議 |
相對簡單,但十分地管用 |
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原理(區塊鏈)、MD5、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:其它