互聯網後臺開發需要掌握什麼?

 

本文內容僅針對互聯網後臺開發從業人員。

互聯網後臺開發,通常意味着分佈式、大數據,涉及到高性能、系統容災、數據容災、高可用性、數據一致性等。自從2008年Hadoop在華夏大地蓬勃發展,開源如火山爆發在業界百花齊放,茁壯成長。國內的BAT、華爲和小米等也大量的參與了國際開源,甚至開源了大量優秀的久經考驗的內部系統,如阿里的TairdruidfastjsonjstormAliSQLRocketMQ和騰訊的RapidJSONlibcoPhxPaxosPhxRPCPhxQueuePhxSQLPaxosStoreMSECTarsTAF等。

 

開源如此繁榮,需要感謝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,雖然之前已經有了LuceneNutch,但蓬勃發展還是從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程序的性能。DockerKubernetes(簡稱k8s)等的繁榮帶動了GO語言走進各大小公司,ThriftgRPC、RESTful等也帶動了多語言混合編程,以及微服務的發展。源自於美軍的“大中臺”,在阿里的帶動下漸爲衆人所知。新興事物Service Mesh(服務網格)也逐漸被越來越多的人所認識。

 

作爲互聯網後臺開發大軍中的一員,面對如此衆多的設施,可能會無所適從,有所迷茫。我們應當如此去治理自己的知識體驗,以在激烈的競爭中爭取到優勢。一個人的精力是有限的,不可能全通,只能儘可能花最少時間掌握更多更基礎的部分。下表中是編程開發需要掌握的:

 

推薦理由

學習建議

Redis

相對簡單,但十分地管用

1) 掌握Redis的實現原理,清楚它的架構(十分值得借鑑);

2) 熟悉它的核心配置項;

3) 瞭解它的主備選舉;

4) 瞭解它的AOF和RDB機制;

5) 掌握它的Module編程。

Zookeeper

安裝和部署難度低,在分佈式中十分有用的東西,相關的有etcd

1) 至少大致瞭解Paxos算法和Raft算法;

2) 會安裝和部署Zookeeper;

3) 會用它做配置服務;

4) 會用它做服務發現;

5) 會用它做服務Master的選舉;

6) 可不深度瞭解Zookeeper的實現,大部分人對算法會有些頭大,所以側重在應用上。

Kafka

業務間和業務流程解耦的核心,對提升開發效率和降低系統複雜度十分管用,

1) 瞭解它的實現原理和系統架構;

2) 熟練掌握Kafka的安裝和部署;

3) 熟悉核心配置項;

4) 能夠基於它編程;

5) 至少會一種Kafka管理軟件,如KafkaManager等;

6) 競品Pulsar最好也有所瞭解。

Hadoop

它是很多的基礎,特別是其中的HDFS和YARN、其中的MapReduce因爲低效率,應用越來越少,Spark、Flink等逐步替代了MapReduce

1) 熟悉它的實現原理和系統架構(十分值得借鑑);

2) 掌握Hadoop的安裝和部署;

3) 掌握HDFS常用命令;

4) 掌握HDFS編程。

HBase

NoSQL的典型代表,十分適合流水類數據的存儲,和Redis不是同一類,相對複雜太多,但流水類數據用它來做存儲再合適不過了。可以和Redis相結合,實現海量的高性能高可用流水服務。

1) 熟悉它的實現原理和系統架構(十分值得借鑑);

2) 掌握HBase的安裝和部署;

3) 掌握HBase常用命令;

4) 掌握HBase編程。

Hive

Hive的SQL界面大大簡化了對大數據的使用,但它實際只是一層殼,低層的計算引擎依賴Mapreduce、Tez和Spark等,注意官方已表明未來版本可能無警告方式不支持Mapreduce這種低效的計算引擎。

1) 熟悉它的使用;

2) 能夠了解些SQL解析會更佳,推薦經典入門書籍《flex與bison》。

Flink

天生集實時(流式)計算和離線計算與一體,不管是實時計算還是離線計算都值得掌握的利器。

1) 熟悉它的實現原理和系統架構;

2) 掌握它的安裝和部署;

3) 掌握Flink實時計算編程;

4) 掌握Flink離線計算編程;

5) 如有精力,實時計算前輩Storm也可瞭解下。

Spark

不但和Flink同類,還是競品,因早Flink出生,生態相對好一些,但實時計算不如Flink。

Flink和Spark可只掌握其中一個,如有精力建議都有所瞭解。

Gafana

監控的不二之選,僅爲Web展現,實際使用需配合InfluxDBPrometheus等。

1) 會用即可

 

ELK

日誌的分析和管理再好不過的東西,ELK實際對應三個不同組件:Elasticsearch、Logstash和Kibana。

1) 會用即可

Protocol buffers

被廣泛使用的可擴展的高性能序列化最好的選擇

1) 會用即可;

2) 瞭解實現原理。

Thrift

應用十分廣泛的開源RPC,Wireshark都支持它,可以幫助快速開發各種服務。本身無線程級對象,所以應用自己藉助GCC的“__thread”或C++的“thread_local”。

1) 會用;

2) 瞭解實現原理;

3) 會定位相關問題。

gRPC

gRPC和Thrift至少要掌握其中一個,建議至少掌握Thrift,雖然後起的gRPC更爲優秀,但Thrift應用得更爲廣泛,支持的語言也更廣,C++98標準環境也能用。

1) 會用;

2) 瞭解實現原理;

3) 會定位相關問題。

Docker

雲時代不得不會的東西

1) 瞭解其原理和架構;

2) 掌握它的使用。

Kubernetes

會Docker,那麼必然要知道同樣採用GO語言開發的Kubernetes,和Docker相關的還包括Mesos

1) 至少初步瞭解

TensorFlow

處於AI時代,即使未從事AI相關的開發工作,那也應當要沾點邊,那麼TensorFlow幾乎是不二選。

1) 初步瞭解;

2) 會簡單使用

GO語言

大數據雲時代光會C/C++不夠

1) 熟練掌握

Java語言

大數據雲時代光會C/C++不夠,除C/C++外,Go和java至少還要熟練掌握一門,最好兩個都熟,何況開源的大部分是Java或Java類語言實現的。

1) 熟練掌握

Bazel

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。

https://kotlinlang.org/

Julia

集Python、C++和R爲一體,面向科學計算的高性能動態高級程序設計語言,可用於天文圖像分析、自動駕駛汽車、機器人、3D打印、精準醫療、增強現實、基因組學、風險管理等,主要應用於數據可視化、通用計算、數據科學、機器學習、科學領域、並行計算六大領域。

https://julialang.org/

Rockstar

圖靈完備的能寫出詩歌般代碼的動態編程語言,用它寫下的不僅僅是一行行可執行的代碼,還是一首青春的讚美語——就像是它的名字一樣,搖滾明星。

https://github.com/dylanbeattie/rockstar

Rust

由Mozilla研究室主導開發的一門現代系統編程語言,Rust是一種系統編程語言,它有着驚人的運行速度,能夠防止段錯誤,並保證線程安全。

https://www.rust-lang.org

 

總結:會用Thrift或gRPC開發各種服務(Service),數據採用可擴展的Protobuf格式,性能要求特別高的服務,可以考慮基於Seastar,順便可以瞭解下ScylladbTiDB(技術粉絲對牛逼的東西總迫於瞭解)。如果服務的本地狀態數據多且複雜,可以考慮採用SQLite存儲。用Flink做實時計算,數據通過Kafka流入Flink,結果緩存到Redis,歸檔到HBase或快照到HDFS。使用Zookeeper做配置分發和服務的主從切換,以及服務發現。用Hive做離線數據的統計,引擎使用Spark,結果數據存Redis、HBase、PostgreSQLMongoDB等。服務的日誌接入ELK,服務的監控藉助InfluxDBPrometheus接入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:其它

 

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