互联网后台开发需要掌握什么?
本文内容仅针对互联网后台开发从业人员。
互联网后台开发,通常意味着分布式、大数据,涉及到高性能、系统容灾、数据容灾、高可用性、数据一致性等。自从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:其它