1. 程式人生 > >網際網路後臺開發需要掌握什麼?

網際網路後臺開發需要掌握什麼?

 

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

網際網路後臺開發,通常意味著分散式、大資料,涉及到高效能、系統容災、資料容災、高可用性、資料一致性等。自從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:其它