後端架構師技術圖譜
《後端架構師技術圖譜》
最後更新於20180427
- 數據結構
- 經常使用算法
- 併發
- 操做系統
- 設計模式
- 運維 & 統計 & 技術支持
- 中間件
- 網絡
- 數據庫
- 搜索引擎
- 性能
- 安全
- 經常使用開源框架
- 分佈式設計
- 設計思想 & 開發模式
- 項目管理
- 通用業務術語
- 技術趨勢
- 架構師素質
- 團隊管理
- 資訊
- 技術資源
(Toc generated by simple-php-github-toc )
數據結構
隊列
-
- 非阻塞隊列:ConcurrentLinkedQueue(無界線程安全),採用CAS機制(compareAndSwapObject原子操做)。
- 阻塞隊列:ArrayBlockingQueue(有界)、LinkedBlockingQueue(無界)、DelayQueue、PriorityBlockingQueue,採用鎖機制;使用 ReentrantLock 鎖。
-
《LinkedList、ConcurrentLinkedQueue、LinkedBlockingQueue對比分析》前端
集合
鏈表、數組
字典、關聯數組
棧
- 《java數據結構與算法之棧(Stack)設計與實現》
- 《Java Stack 類》
- 《java stack的詳細實現分析》
- Stack 是線程安全的。
- 內部使用數組保存數據,不夠時翻倍。
樹
二叉樹
每一個節點最多有兩個葉子節點。java
徹底二叉樹
- 《徹底二叉樹》
- 葉節點只能出如今最下層和次下層,而且最下面一層的結點都集中在該層最左邊的若干位置的二叉樹。
平衡二叉樹
左右兩個子樹的高度差的絕對值不超過1,而且左右兩個子樹都是一棵平衡二叉樹。python
二叉查找樹(BST)
二叉查找樹(Binary Search Tree),也稱有序二叉樹(ordered binary tree),排序二叉樹(sorted binary tree)。mysql
紅黑樹
- 《最容易懂得紅黑樹》
- 添加階段後,左旋或者右旋從而再次達到平衡。
- 《淺談算法和數據結構: 九 平衡查找樹之紅黑樹》
B-,B+,B*樹
MySQL是基於B+樹彙集索引組織表linux
- 《B-樹,B+樹,B*樹詳解》
- 《B-樹,B+樹與B*樹的優缺點比較》
- B+ 數的葉子節點鏈表結構相比於 B- 數便於掃庫,和範圍檢索。
LSM 樹
LSM(Log-Structured Merge-Trees)和 B+ 樹相比,是犧牲了部分讀的性能來換取寫的性能(經過批量寫入),實現讀寫之間的。 Hbase、LevelDB、Tair(Long DB)、nessDB 採用 LSM 樹的結構。LSM能夠快速創建索引。ios
-
《LSM樹 VS B+樹》nginx
- B+ 樹讀性能好,但因爲須要有序結構,當key比較分散時,磁盤尋道頻繁,形成寫性能。
- LSM 是將一個大樹拆分紅N棵小樹,先寫到內存(無尋道問題,性能高),在內存中構建一顆有序小樹(有序樹),隨着小樹愈來愈大,內存的小樹會flush到磁盤上。當讀時,因爲不知道數據在哪棵小樹上,所以必須遍歷(二分查找)全部的小樹,但在每顆小樹內部數據是有序的。
-
《LSM樹(Log-Structured Merge Tree)存儲引擎》git
- 極端的說,基於LSM樹實現的HBase的寫性能比MySQL高了一個數量級,讀性能低了一個數量級。
- 優化方式:Bloom filter 替代二分查找;compact 小數位大樹,提升查詢性能。
- Hbase 中,內存中達到必定閾值後,總體flush到磁盤上、造成一個文件(B+數),HDFS不支持update操做,因此Hbase作總體flush而不是merge update。flush到磁盤上的小樹,按期會合併成一個大樹。
BitSet
常常用於大規模數據的排重檢查。
經常使用算法
排序、查找算法
選擇排序
- 《Java中的經典算法之選擇排序(SelectionSort)》
- 每一趟從待排序的記錄中選出最小的元素,順序放在已排好序的序列最後,直到所有記錄排序完畢。
冒泡排序
- 《冒泡排序的2種寫法》
- 相鄰元素先後交換、把最大的排到最後。
- 時間複雜度 O(n²)
插入排序
快速排序
- 《坐在馬桶上看算法:快速排序》
- 一側比另一次都大或小。
歸併排序
- 《圖解排序算法(四)之歸併排序》
- 分而治之,分紅小份排序,在合併(重建一個新空間進行復制)。
希爾排序
TODO
堆排序
- 《圖解排序算法(三)之堆排序》
- 排序過程就是構建最大堆的過程,最大堆:每一個結點的值都大於或等於其左右孩子結點的值,堆頂元素是最大值。
計數排序
- 《計數排序和桶排序》
- 和桶排序過程比較像,差異在於桶的數量。
桶排序
- 《【啊哈!算法】最快最簡單的排序——桶排序》
- 《排序算法(三):計數排序與桶排序》
- 桶排序將[0,1)區間劃分爲n個相同的大小的子區間,這些子區間被稱爲桶。
- 每一個通單獨進行排序,而後再遍歷每一個桶。
基數排序
按照個位、十位、百位、...依次來排。
二分查找
-
- 要求待查找的序列有序。
- 時間複雜度 O(logN)。
-
- while + 遞歸。
Java 中的排序工具
- 《Arrays.sort和Collections.sort實現原理解析》
- Collections.sort算法調用的是合併排序。
- Arrays.sort() 採用了2種排序算法 -- 基本類型數據使用快速排序法,對象數組使用歸併排序。
布隆過濾器
經常使用於大數據的排重,好比email,url 等。 核心原理:將每條數據經過計算產生一個指紋(一個字節或多個字節,但必定比原始數據要少不少),其中每一位都是經過隨機計算得到,在將指紋映射到一個大的按位存儲的空間中。注意:會有必定的錯誤率。 優勢:空間和時間效率都很高。 缺點:隨着存入的元素數量增長,誤算率隨之增長。
- 《布隆過濾器 -- 空間效率很高的數據結構》
- 《大量數據去重:Bitmap和布隆過濾器(Bloom Filter)》
- 《基於Redis的布隆過濾器的實現》
- 基於 Redis 的 Bitmap 數據結構。
- 《網絡爬蟲:URL去重策略之布隆過濾器(BloomFilter)的使用》
- 使用Java中的 BitSet 類 和 加權和hash算法。
字符串比較
KPM 算法
KPM:Knuth-Morris-Pratt算法(簡稱KMP) 核心原理是利用一個「部分匹配表」,跳過已經匹配過的元素。
深度優先、廣度優先
貪心算法
回溯算法
剪枝算法
動態規劃
樸素貝葉斯
-
- P(B|A)=P(A|B)P(B)/P(A)
推薦算法
最小生成樹算法
最短路徑算法
併發
多線程
線程安全
一致性、事務
事務 ACID 特性
事務的隔離級別
-
未提交讀:一個事務能夠讀取另外一個未提交的數據,容易出現髒讀的狀況。
-
讀提交:一個事務等另一個事務提交以後才能夠讀取數據,但會出現不可重複讀的狀況(屢次讀取的數據不一致),讀取過程當中出現UPDATE操做,會多。(大多數數據庫默認級別是RC,好比SQL Server,Oracle),讀取的時候不能夠修改。
-
可重複讀: 同一個事務裏確保每次讀取的時候,得到的是一樣的數據,但不保障原始數據被其餘事務更新(幻讀),Mysql InnoDB 就是這個級別。
-
序列化:全部事物串行處理(犧牲了效率)
-
- 幻讀的例子很是清楚。
- 經過 SELECT ... FOR UPDATE 解決。
鎖
Java中的鎖和同步類
-
- 主要包括 synchronized、ReentrantLock、和 ReadWriteLock。
-
- 有數量控制
- 申請用 acquire,申請不要則阻塞;釋放用 release。
-
- 簡單的說 就是Mutex是排它的,只有一個能夠獲取到資源, Semaphore也具備排它性,但能夠定義多個能夠獲取的資源的對象。
公平鎖 & 非公平鎖
公平鎖的做用就是嚴格按照線程啓動的順序來執行的,不容許其餘線程插隊執行的;而非公平鎖是容許插隊的。
- 《公平鎖與非公平鎖》
- 默認狀況下 ReentrantLock 和 synchronized 都是非公平鎖。ReentrantLock 能夠設置成公平鎖。
悲觀鎖 & 樂觀鎖 & CAS
-
- 樂觀鎖的方式:版本號+重試方式
- 悲觀鎖:經過 select ... for update 進行行鎖。
-
- 和MySQL樂觀鎖方式類似,只不過是經過和原值進行比較。
ABA 問題
因爲高併發,在CAS下,更新後可能此A非彼A。經過版本號能夠解決,相似於上文Mysql 中提到的的樂觀鎖。
- 《Java CAS 和ABA問題》
- 《Java 中 ABA問題及避免》
- AtomicStampedReference 和 AtomicStampedReference。
CopyOnWrite容器
能夠對CopyOnWrite容器進行併發的讀,而不須要加鎖。CopyOnWrite併發容器用於讀多寫少的併發場景。好比白名單,黑名單,商品類目的訪問和更新場景,不適合須要數據強一致性的場景。
-
《JAVA中寫時複製(Copy-On-Write)Map實現》
- 實現讀寫分離,讀取發生在原始數據上,寫入發生在副本上。
- 不用加鎖,經過最終一致實現一致性。
RingBuffer
可重入鎖 & 不可重入鎖
-
- 經過簡單代碼舉例說明可重入鎖和不可重入鎖。
- 可重入鎖指同一個線程能夠再次得到以前已經得到的鎖。
- 可重入鎖能夠用戶避免死鎖。
- Java中的可重入鎖:synchronized 和 java.util.concurrent.locks.ReentrantLock
-
《ReenTrantLock可重入鎖(和synchronized的區別)總結》
- synchronized 使用方便,編譯器來加鎖,是非公平鎖。
- ReenTrantLock 使用靈活,鎖的公平性能夠定製。
- 相同加鎖場景下,推薦使用 synchronized。
互斥鎖 & 共享鎖
互斥鎖:同時只能有一個線程得到鎖。好比,ReentrantLock 是互斥鎖,ReadWriteLock 中的寫鎖是互斥鎖。 共享鎖:能夠有多個線程同時或的鎖。好比,Semaphore、CountDownLatch 是共享鎖,ReadWriteLock 中的讀鎖是共享鎖。
死鎖
-
- 互斥、持有、不可剝奪、不可剝奪。
-
- JConsole 能夠識別死鎖。
-
- jstack 能夠顯示死鎖。
操做系統
計算機原理
進程
TODO
線程
協程
- 《終結python協程----從yield到actor模型的實現》
- 線程的調度是由操做系統負責,協程調度是程序自行負責
- 與線程相比,協程減小了無畏的操做系統切換.
- 實際上當遇到IO操做時作切換才更有意義,(由於IO操做不用佔用CPU),若是沒遇到IO操做,按照時間片切換.
Linux
設計模式
設計模式的六大原則
- 《設計模式的六大原則》
- 開閉原則:對擴展開放,對修改關閉,多使用抽象類和接口。
- 里氏代換原則:基類能夠被子類替換,使用抽象類繼承,不使用具體類繼承。
- 依賴倒轉原則:要依賴於抽象,不要依賴於具體,針對接口編程,不針對實現編程。
- 接口隔離原則:使用多個隔離的接口,比使用單個接口好,創建最小的接口。
- 迪米特法則:一個軟件實體應當儘量少地與其餘實體發生相互做用,經過中間類創建聯繫。
- 合成複用原則:儘可能使用合成/聚合,而不是使用繼承,儘可能使用合成/聚合,而不是使用繼承。
23種常見設計模式
應用場景
-
-
結構型模式:
- 適配器:用來把一個接口轉化成另外一個接口,如 java.util.Arrays#asList()。
- 橋接模式:這個模式將抽象和抽象操做的實現進行了解耦,這樣使得抽象和實現能夠獨立地變化,如JDBC;
- 組合模式:使得客戶端看來單個對象和對象的組合是同等的。換句話說,某個類型的方法同時也接受自身類型做爲參數,如 Map.putAll,List.addAll、Set.addAll。
- 裝飾者模式:動態的給一個對象附加額外的功能,這也是子類的一種替代方式,如 java.util.Collections#checkedList|Map|Set|SortedSet|SortedMap。
- 享元模式:使用緩存來加速大量小對象的訪問時間,如 valueOf(int)。
- 代理模式:代理模式是用一個簡單的對象來代替一個複雜的或者建立耗時的對象,如 java.lang.reflect.Proxy
-
建立模式:
- 抽象工廠模式:抽象工廠模式提供了一個協議來生成一系列的相關或者獨立的對象,而不用指定具體對象的類型,如 java.util.Calendar#getInstance()。
- 建造模式(Builder):定義了一個新的類來構建另外一個類的實例,以簡化複雜對象的建立,如:java.lang.StringBuilder#append()。
- 工廠方法:就是 一個返 * 回具體對象的方法,而不是多個,如 java.lang.Object#toString()、java.lang.Class#newInstance()。
- 原型模式:使得類的實例可以生成自身的拷貝、如:java.lang.Object#clone()。
- 單例模式:全局只有一個實例,如 java.lang.Runtime#getRuntime()。
-
行爲模式:
- 責任鏈模式:經過把請求從一個對象傳遞到鏈條中下一個對象的方式,直到請求被處理完畢,以實現對象間的解耦。如 javax.servlet.Filter#doFilter()。
- 命令模式:將操做封裝到對象內,以便存儲,傳遞和返回,如:java.lang.Runnable。
- 解釋器模式:定義了一個語言的語法,而後解析相應語法的語句,如,java.text.Format,java.text.Normalizer。
- 迭代器模式:提供一個一致的方法來順序訪問集合中的對象,如 java.util.Iterator。
- 中介者模式:經過使用一箇中間對象來進行消息分發以及減小類之間的直接依賴,java.lang.reflect.Method#invoke()。
- 空對象模式:如 java.util.Collections#emptyList()。
- 觀察者模式:它使得一個對象能夠靈活的將消息發送給感興趣的對象,如 java.util.EventListener。
- 模板方法模式:讓子類能夠重寫方法的一部分,而不是整個重寫,如 java.util.Collections#sort()。
-
單例模式
責任鏈模式
TODO
MVC
- 《MVC 模式》
- 模型(model)-視圖(view)-控制器(controller)
IOC
- 《理解 IOC》
- 《IOC 的理解與解釋》
- 正向控制:傳統經過new的方式。反向控制,經過容器注入對象。
- 做用:用於模塊解耦。
- DI:Dependency Injection,即依賴注入,只關心資源使用,不關心資源來源。
AOP
- 《輕鬆理解AOP(面向切面編程)》
- 《Spring AOP詳解》
- 《Spring AOP的實現原理》
- Spring AOP使用的動態代理,主要有兩種方式:JDK動態代理和CGLIB動態代理。
- 《Spring AOP 實現原理與 CGLIB 應用》
- Spring AOP 框架對 AOP 代理類的處理原則是:若是目標對象的實現類實現了接口,Spring AOP 將會採用 JDK 動態代理來生成 AOP 代理類;若是目標對象的實現類沒有實現接口,Spring AOP 將會採用 CGLIB 來生成 AOP 代理類
UML
微服務思想
康威定律
-
- 定律一:組織溝通方式會經過系統設計表達出來,就是說架構的佈局和組織結構會有類似。
- 定律二:時間再多一件事情也不可能作的完美,但總有時間作完一件事情。一口氣吃不成胖子,先搞定能搞定的。
- 定律三:線型系統和線型組織架構間有潛在的異質同態特性。種瓜得瓜,作獨立自治的字系統減小溝通成本。
- 定律四:大的系統組織老是比小系統更傾向於分解。合久必分,分而治之。
運維 & 統計 & 技術支持
常規監控
-
- 監控的方式:主動、被動、旁路(好比輿情監控)
- 監控類型: 基礎監控、服務端監控、客戶端監控、 監控、用戶端監控
- 監控的目標:全、塊、準
- 核心指標:請求量、成功率、耗時
-
- Zabbix、Nagios、Ganglia、Zenoss、Open-falcon、監控寶、 360網站服務監控、阿里雲監控、百度雲觀測、小蜜蜂網站監測等。
命令行監控工具
-
- top、sar、tsar、nload
APM
APM — Application Performance Management
-
- 主要基於 Google的Dapper(大規模分佈式系統的跟蹤系統) 思想。
- 開源軟件有:Pinpoint、SkyWalking、Zipkin、CAT
統計分析
-
- 經常使用指標:訪問與訪客、停留時長、跳出率、退出率、轉化率、參與度
-
- 第三方統計:友盟、百度移動、魔方、App Annie、talking data、神策數據等。
-
- 所謂無痕、即經過可視化工具配置採集節點,在前端自動解析配置並上報埋點數據,而非硬編碼。
持續集成(CI/CD)
Jenkins
環境分離
開發、測試、生成環境分離。
自動化運維
Ansible
puppet
chef
測試
TDD 理論
- 《深度解讀 - TDD(測試驅動開發)》
- 基於測試用例編碼功能代碼,XP(Extreme Programming)的核心實踐.
- 好處:一次關注一個點,下降思惟負擔;迎接需求變化或改善代碼的設計;提早澄清需求;快速反饋;
單元測試
- 《Java單元測試之JUnit篇》
- 《JUnit 4 與 TestNG 對比》
- TestNG 覆蓋 JUnit 功能,適用於更復雜的場景。
- 《單元測試主要的測試功能點》
- 模塊接口測試、局部數據結構測試、路徑測試 、錯誤處理測試、邊界條件測試 。
壓力測試
全鏈路壓測
A/B Test
虛擬化
KVM
Xen
OpenVZ
容器技術
Docker
雲技術
OpenStack
DevOps
文檔管理
- Confluence-收費文檔管理系統
- GitLab?
- Wiki
中間件
Web Server
Nginx
-
- Nginx 經過異步非阻塞的事件處理機制實現高併發。Apache 每一個請求獨佔一個線程,很是消耗系統資源。
- 事件驅動適合於IO密集型服務(Nginx),多進程或線程適合於CPU密集型服務(Apache),因此Nginx適合作反向代理,而非web服務器使用。
-
- nginx只適合靜態和反向代理,不適合處理動態請求。
OpenResty
- 官方網站
- 《淺談 OpenResty》
- 經過 Lua 模塊能夠在Nginx上進行開發。
Apache Httpd
Tomcat
架構原理
-
《JBoss vs. Tomcat: Choosing A Java Application Server》
- Tomcat 是輕量級的 Serverlet 容器,沒有實現所有 JEE 特性(好比持久化和事務處理),但能夠經過其餘組件代替,好比Srping。
- Jboss 實現所有了JEE特性,軟件開源免費、文檔收費。
調優方案
-
- 啓動NIO模式(或者APR);調整線程池;禁用AJP鏈接器(Nginx+tomcat的架構,不須要AJP);
-
- AJP 協議(8009端口)用於下降和前端Server(如Apache,並且須要支持AJP協議)的鏈接數(前端),經過長鏈接提升性能。
- 併發高時,AJP協議優於HTTP協議。
Jetty
- 《Jetty 的工做原理以及與 Tomcat 的比較》
- 《jetty和tomcat優點比較》
- 架構比較:Jetty的架構比Tomcat的更爲簡單。
- 性能比較:Jetty和Tomcat性能方面差別不大,Jetty默認採用NIO結束在處理I/O請求上更佔優點,Tomcat默認採用BIO處理I/O請求,Tomcat適合處理少數很是繁忙的連接,處理靜態資源時性能較差。
- 其餘方面:Jetty的應用更加快速,修改簡單,對新的Servlet規範的支持較好;Tomcat 對JEE和Servlet 支持更加全面。
緩存
本地緩存
-
- 堆內、堆外、磁盤三級緩存。
- 可按照緩存空間容量進行設置。
- 按照時間、次數等過時策略。
-
- 簡單輕量、無堆外、磁盤緩存。
-
- 簡單輕量、無堆外、磁盤緩存。
客戶端緩存
-
- 主要是利用 Cache-Control 參數。
Memcached
-
- 採用多路複用技術提升併發性。
- slab分配算法: memcached給Slab分配內存空間,默認是1MB。分配給Slab以後 把slab的切分紅大小相同的chunk,Chunk是用於緩存記錄的內存空間,Chunk 的大小默認按照1.25倍的速度遞增。好處是不會頻繁申請內存,提升IO效率,壞處是會有必定的內存浪費。
-
《memcache 中 add 、 set 、replace 的區別》
- 區別在於當key存在仍是不存在時,返回值是true和false的。
Redis
-
- 使用 ziplist 存儲鏈表,ziplist是一種壓縮鏈表,它的好處是更能節省內存空間,由於它所存儲的內容都是在連續的內存區域當中的。
- 使用 skiplist(跳躍表)來存儲有序集合對象、查找上先從高Level查起、時間複雜度和紅黑樹至關,實現容易,無鎖、併發性好。
-
- RDB方式:按期備份快照,經常使用於災難恢復。優勢:經過fork出的進程進行備份,不影響主進程、RDB 在恢復大數據集時的速度比 AOF 的恢復速度要快。缺點:會丟數據。
- AOF方式:保存操做日誌方式。優勢:恢復時數據丟失少,缺點:文件大,回覆慢。
- 也能夠二者結合使用。
架構
回收策略
Tair
- 官方網站
- 《Tair和Redis的對比》
- 特色:能夠配置備份節點數目,經過異步同步到備份節點
- 一致性Hash算法。
- 架構:和Hadoop 的設計思想相似,有Configserver,DataServer,Configserver 經過心跳來檢測,Configserver也有主備關係。
幾種存儲引擎:
- MDB,徹底內存性,能夠用來存儲Session等數據。
- Rdb(相似於Redis),輕量化,去除了aof之類的操做,支持Restfull操做
- LDB(LevelDB存儲引擎),持久化存儲,LDB 做爲rdb的持久化,google實現,比較高效,理論基礎是LSM(Log-Structured-Merge Tree)算法,如今內存中修改數據,達到必定量時(和內存彙總的舊數據一同寫入磁盤)再寫入磁盤,存儲更加高效,縣比喻Hash算法。
- Tair採用共享內存來存儲數據,若是服務掛掉(非服務器),重啓服務以後,數據亦然還在。
消息隊列
-
《消息隊列-推/拉模式學習 & ActiveMQ及JMS學習》
- RabbitMQ 消費者默認是推模式(也支持拉模式)。
- Kafka 默認是拉模式。
- Push方式:優勢是能夠儘量快地將消息發送給消費者,缺點是若是消費者處理能力跟不上,消費者的緩衝區可能會溢出。
- Pull方式:優勢是消費端能夠按處理能力進行拉去,缺點是會增長消息延遲。
消息總線
消息總線至關於在消息隊列之上作了一層封裝,統一入口,統一管控、簡化接入成本。
消息的順序
RabbitMQ
支持事務,推拉模式都是支持、適合須要可靠性消息傳輸的場景。
RocketMQ
Java實現,推拉模式都是支持,吞吐量遜於Kafka。能夠保證消息順序。
ActiveMQ
純Java實現,兼容JMS,能夠內嵌於Java應用中。
Kafka
高吞吐量、採用拉模式。適合搞IO場景,好比日誌同步。
Redis 消息推送
生產者、消費者模式徹底是客戶端行爲,list 和 拉模式實現,阻塞等待採用 blpop 指令。
ZeroMQ
TODO
定時調度
單機定時調度
-
- fork 進程 + sleep 輪詢
-
- 定時調度在 QuartzSchedulerThread 代碼中,while()無限循環,每次循環取出時間將到的trigger,觸發對應的job,直到調度器線程被關閉。
分佈式定時調度
-
- opencron、LTS、XXL-JOB、Elastic-Job、Uncode-Schedule、Antares
-
- Quartz集羣中,獨立的Quartz節點並不與另外一其的節點或是管理節點通訊,而是經過相同的數據庫表來感知到另外一Quartz應用的
RPC
-
- 核心角色:Server: 暴露服務的服務提供方、Client: 調用遠程服務的服務消費方、Registry: 服務註冊與發現的註冊中心。
Dubbo
** SPI ** TODO
Thrift
- 官方網站
- 《Thrift RPC詳解》
- 支持多語言,經過中間語言定義接口。
gRPC
服務端能夠認證加密,在外網環境下,能夠保證數據安全。
數據庫中間件
Sharding Jdbc
日誌系統
日誌蒐集
配置中心
-
- Spring Boot 和 Spring Cloud
- 支持推、拉模式更新配置
- 支持多種語言
servlet 3.0 異步特性可用於配置中心的客戶端
API 網關
主要職責:請求轉發、安全認證、協議轉換、容災。
網絡
協議
OSI 七層協議
TCP/IP
HTTP
HTTP2.0
- 《HTTP 2.0 原理詳細分析》
- 《HTTP2.0的基本單位爲二進制幀》
- 利用二進制幀負責傳輸。
- 多路複用。
HTTPS
網絡模型
-
《web優化必須瞭解的原理之I/o的五種模型和web的三種工做模式》
- 五種I/O模型:阻塞I/O,非阻塞I/O,I/O複用、事件(信號)驅動I/O、異步I/O,前四種I/O屬於同步操做,I/O的第一階段不一樣、第二階段相同,最後的一種則屬於異步操做。
- 三種 Web Server 工做方式:Prefork(多進程)、Worker方式(線程方式)、Event方式。
-
- select,poll,epoll本質上都是同步I/O,由於他們都須要在讀寫事件就緒後本身負責進行讀寫,也就是說這個讀寫過程是阻塞的。
- select 有打開文件描述符數量限制,默認1024(2048 for x64),100萬併發,就要用1000個進程、切換開銷大;poll採用鏈表結構,沒有數量限制。
- select,poll 「醒着」的時候要遍歷整個fd集合,而epoll在「醒着」的時候只要判斷一下就緒鏈表是否爲空就好了,經過回調機制節省大量CPU時間;select,poll每次調用都要把fd集合從用戶態往內核態拷貝一次,而epoll只要一次拷貝。
- poll會隨着併發增長,性能逐漸降低,epoll採用紅黑樹結構,性能穩定,不會隨着鏈接數增長而下降。
-
- 在鏈接數少而且鏈接都十分活躍的狀況下,select和poll的性能可能比epoll好,畢竟epoll的通知機制須要不少函數回調。
-
- NIO 是一種同步非阻塞的 IO 模型。同步是指線程不斷輪詢 IO 事件是否就緒,非阻塞是指線程在等待 IO 的時候,能夠同時作其餘任務
Epoll
Java NIO
kqueue
鏈接和短鏈接
框架
- 《Netty原理剖析》
- Reactor 模式介紹。
- Netty 是 Reactor 模式的一種實現。
零拷貝(Zero-copy)
- 《對於 Netty ByteBuf 的零拷貝(Zero Copy) 的理解》
- 多個物理分離的buffer,經過邏輯上合併成爲一個,從而避免了數據在內存之間的拷貝。
序列化(二進制協議)
Hessian
- 《Hessian原理分析》 Binary-RPC;不只僅是序列化
Protobuf
- 《Protobuf協議的Java應用例子》 Goolge出品、佔用空間和效率完勝其餘序列化類庫,如Hessian;須要編寫 .proto 文件。
- 《Protocol Buffers序列化協議及應用》 關於協議的解釋;缺點:可讀性差;
數據庫
基礎理論
數據庫設計的三大範式
- 《數據庫的三大範式以及五大約束》
- 第一範式:數據表中的每一列(每一個字段)必須是不可拆分的最小單元,也就是確保每一列的原子性;
- 第二範式(2NF):知足1NF後,要求表中的全部列,都必須依賴於主鍵,而不能有任何一列與主鍵沒有關係,也就是說一個表只描述一件事情;
- 第三範式:必須先知足第二範式(2NF),要求:表中的每一列只與主鍵直接相關而不是間接相關,(表中的每一列只能依賴於主鍵);
MySQL
原理
-
- 兩種類型最主要的差異就是Innodb 支持事務處理與外鍵和行級鎖
InnoDB
優化
-
《MySQL36條軍規》
-
- 原則上就是縮小掃描範圍。
索引
彙集索引, 非彙集索引
MyISAM 是非彙集,InnoDB 是彙集
複合索引
自適應哈希索引(AHI)
explain
NoSQL
MongoDB
- MongoDB 教程
- 《Mongodb相對於關係型數據庫的優缺點》
- 優勢:弱一致性(最終一致),更能保證用戶的訪問速度;內置GridFS,支持大容量的存儲;Schema-less 數據庫,不用預先定義結構;內置Sharding;相比於其餘NoSQL,第三方支持豐富;性能優越;
- 缺點:mongodb不支持事務操做;mongodb佔用空間過大;MongoDB沒有如MySQL那樣成熟的維護工具,這對於開發和IT運營都是個值得注意的地方;
Hbase
搜索引擎
搜索引擎原理
Lucene
Elasticsearch
Solr
sphinx
性能
性能優化方法論
-
- 代碼層面、業務層面、數據庫層面、服務器層面、前端優化。
容量評估
CDN 網絡
鏈接池
性能調優
#大數據
流式計算
Storm
Flink
Kafka Stream
應用場景
例如:
- 廣告相關實時統計;
- 推薦系統用戶畫像標籤實時更新;
- 線上服務健康情況實時監測;
- 實時榜單;
- 實時數據統計。
Hadoop
HDFS
MapReduce
Yarn
Spark
安全
web 安全
XSS
CSRF
SQL 注入
Hash Dos
- 《邪惡的JAVA HASH DOS攻擊》
- 利用JsonObjet 上傳大Json,JsonObject 底層使用HashMap;不一樣的數據產生相同的hash值,使得構建Hash速度變慢,耗盡CPU。
- 《一種高級的DoS攻擊-Hash碰撞攻擊》
- 《關於Hash Collision DoS漏洞:解析與解決方案》
腳本注入
漏洞掃描工具
驗證碼
-
- 滑動驗證碼是根據人在滑動滑塊的響應時間,拖拽速度,時間,位置,軌跡,重試次數等來評估風險。
DDoS 防範
用戶隱私信息保護
TODO
加密解密
對稱加密
- 《常見對稱加密算法》
- DES、3DES、Blowfish、AES
- DES 採用 56位祕鑰,Blowfish 採用1到448位變長祕鑰,AES 128,192和256位長度的祕鑰。
- DES 祕鑰過短(只有56位)算法目前已經被 AES 取代,而且 AES 有硬件加速,性能很好。
哈希算法
-
- MD5 和 SHA-1 已經再也不安全,已被棄用。
- 目前 SHA-256 是比較安全的。
非對稱加密
- 《常見非對稱加密算法》
-
RSA、DSA、ECDSA(螺旋曲線加密算法)
-
和 RSA 不一樣的是 DSA 僅能用於數字簽名,不能進行數據加密解密,其安全性和RSA至關,但其性能要比RSA快。
-
256位的ECC祕鑰的安全性等同於3072位的RSA祕鑰。
-
服務器安全
數據安全
數據備份
TODO
網絡隔離
內外網分離
TODO
登陸跳板機
在內外環境中經過跳板機登陸到線上主機。
受權
RBAC
OAuth2.0
經常使用開源框架
開源協議
日誌框架
Log4j、Log4j2
- 《log4j 詳細講解》
- 《log4j2 實際使用詳解》
- 《Log4j1,Logback以及Log4j2性能測試對比》
- Log4J 異步日誌性能優異。
Logback
ORM
- 《ORM框架使用優缺點》
- 主要目的是爲了提升開發效率。
MyBatis:
-
- 一級緩存是SqlSession級別的緩存,緩存的數據只在SqlSession內有效
- 二級緩存是mapper級別的緩存,同一個namespace公用這一個緩存,因此對SqlSession是共享的;使用 LRU 機制清理緩存,經過 cacheEnabled 參數開啓。
網絡框架
TODO
Web 框架
Spring 家族
Spring
Spring Boot
Spring Cloud
工具框架
分佈式設計
擴展性設計
-
- 總結下來,通用的套路就是分佈、緩存及異步處理。
-
- 水平切分+垂直切分
- 利用中間件進行分片如,MySQL Proxy。
- 利用分片策略進行切分,如按照ID取模。
-
- 分佈式服務+消息隊列。
穩定性 & 高可用
-
- 可擴展:水平擴展、垂直擴展。 經過冗餘部署,避免單點故障。
- 隔離:避免單一業務佔用所有資源。避免業務之間的相互影響 2. 機房隔離避免單點故障。
- 解耦:下降維護成本,下降耦合風險。減小依賴,減小相互間的影響。
- 限流:滑動窗口計數法、漏桶算法、令牌桶算法等算法。遇到突發流量時,保證系統穩定。
- 降級:緊急狀況下釋放非核心功能的資源。犧牲非核心業務,保證核心業務的高可用。
- 熔斷:異常狀況超出閾值進入熔斷狀態,快速失敗。減小不穩定的外部依賴對核心服務的影響。
- 自動化測試:經過完善的測試,減小發布引發的故障。
- 灰度發佈:灰度發佈是速度與安全性做爲妥協,可以有效減小發布故障。
-
- 設計原則:數據不丟(持久化);服務高可用(服務副本);絕對的100%高可用很難,目標是作到儘量多的9,如99.999%(整年累計只有5分鐘)。
硬件負載均衡
-
- 主要是和F5對比。
軟件負載均衡
-
《幾種負載均衡算法》 輪尋、權重、負載、最少鏈接、QoS
-
- 配置簡單,更新速度慢。
-
- 簡單輕量、學習成本低;主要適用於web應用。
-
- 配置比較負載、只支持到4層,性能較高。
-
- 支持到七層(好比HTTP)、功能比較全面,性能也不錯。
-
《Haproxy+Keepalived+MySQL實現讀均衡負載》
- 主要是用戶讀請求的負載均衡。
限流
- 《談談高併發系統的限流》
- 計數器:經過滑動窗口計數器,控制單位時間內的請求次數,簡單粗暴。
- 漏桶算法:固定容量的漏桶,漏桶滿了就丟棄請求,比較經常使用。
- 令牌桶算法:固定容量的令牌桶,按照必定速率添加令牌,處理請求前須要拿到令牌,拿不到令牌則丟棄請求,或進入丟隊列,能夠經過控制添加令牌的速率,來控制總體速度。Guava 中的 RateLimiter 是令牌桶的實現。
- Nginx 限流:經過
limit_req
等模塊限制併發鏈接數。
應用層容災
-
- 雪崩效應緣由:硬件故障、硬件故障、程序Bug、重試加大流量、用戶大量請求。
- 雪崩的對策:限流、改進緩存模式(緩存預加載、同步調用改異步)、自動擴容、降級。
- Hystrix設計原則:
- 資源隔離:Hystrix經過將每一個依賴服務分配獨立的線程池進行資源隔離, 從而避免服務雪崩。
- 熔斷開關:服務的健康情況 = 請求失敗數 / 請求總數,經過閾值設定和滑動窗口控制開關。
- 命令模式:經過繼承 HystrixCommand 來包裝服務調用邏輯。
-
- 主要策略:失效瞬間:單機使用鎖;使用分佈式鎖;不過時;
- 熱點數據:熱點數據單獨存儲;使用本地緩存;分紅多個子key;
跨機房容災
-
- 經過自研中間件進行數據同步。
-
- 注意延遲問題,屢次跨機房調用會將延時放大數倍。
- 建房間專線很大機率會出現問題,作好運維和程序層面的容錯。
- 不能依賴於程序端數據雙寫,要有自動同步方案。
- 數據永不在高延遲和較差網絡質量下,考慮同步質量問題。
- 核心業務和次要業務分而治之,甚至只考慮核心業務。
- 異地多活監控部署、測試也要跟上。
- 業務容許的狀況下考慮用戶分區,尤爲是遊戲、郵箱業務。
- 控制跨機房消息體大小,越小越好。
- 考慮使用docker容器虛擬化技術,提升動態調度能力。
容災演練流程
- 《依賴治理、灰度發佈、故障演練,阿里電商故障演練系統的設計與實戰經驗》
- 常見故障畫像
- 案例:預案有效性、預案有效性、故障復現、架構容災測試、參數調優、參數調優、故障突襲、聯合演練。
平滑啓動
-
平滑重啓應用思路 1.端流量(如vip層)、2. flush 數據(若是有)、3, 重啓應用
-
《JVM安全退出(如何優雅的關閉java服務)》 推薦推出方式:System.exit,Kill SIGTERM;不推薦 kill-9;用 Runtime.addShutdownHook 註冊鉤子。
-
《常見Java應用如何優雅關閉》 Java、Srping、Dubbo 優雅關閉方式。
數據庫擴展
讀寫分離模式
-
《DRBD+Heartbeat+Mysql高可用讀寫分離架構》
- DRDB 進行磁盤複製,避免單點問題。
分片模式
-
- 中間件: 輕量級:sharding-jdbc、TSharding;重量級:Atlas、MyCAT、Vitess等。
- 問題:事務、Join、遷移、擴容、ID、分頁等。
- 事務補償:對數據進行對賬檢查;基於日誌進行比對;按期同標準數據來源進行同步等。
- 分庫策略:數值範圍;取模;日期等。
- 分庫數量:一般 MySQL 單庫 5千萬條、Oracle 單庫一億條須要分庫。
-
- 分區:是MySQL內部機制,對客戶端透明,數據存儲在不一樣文件中,表面上看是同一個表。
- 分表:物理上建立不一樣的表、客戶端須要管理分表路由。
服務治理
服務註冊與發現
-
- 客戶端服務發現模式:客戶端直接查詢註冊表,同時本身負責負載均衡。Eureka 採用這種方式。
- 服務器端服務發現模式:客戶端經過負載均衡查詢服務實例。
-
《SpringCloud服務註冊中心比較:Consul vs Zookeeper vs Etcd vs Eureka》
- CAP支持:Consul(CA)、zookeeper(cp)、etcd(cp) 、euerka(ap)
- 做者認爲目前 Consul 對 Spring cloud 的支持比較好。
-
- 優勢:API簡單、Pinterest,Airbnb 在用、多語言、經過watcher機制來實現配置PUSH,能快速響應配置變化。
服務路由控制
- 《分佈式服務框架學習筆記4 服務路由》
- 原則:透明化路由
- 負載均衡策略:隨機、輪詢、服務調用延遲、一致性哈希、粘滯鏈接
- 本地路由有限策略:injvm(優先調用jvm內部的服務),innative(優先使用相同物理機的服務),原則上找距離最近的服務。
- 配置方式:統一註冊表;本地配置;動態下發。
分佈式一致
CAP 與 BASE 理論
- 《從分佈式一致性談到CAP理論、BASE理論》
- 一致性分類:強一致(當即一致);弱一致(可在單位時間內實現一致,好比秒級);最終一致(弱一致的一種,必定時間內最終一致)
- CAP:一致性、可用性、分區容錯性(網絡故障引發)
- BASE:Basically Available(基本可用)、Soft state(軟狀態)和Eventually consistent(最終一致性)
- BASE理論的核心思想是:即便沒法作到強一致性,但每一個應用均可以根據自身業務特色,採用適當的方式來使系統達到最終一致性。
分佈式鎖
-
- 基於數據庫的分佈式鎖:優勢:操做簡單、容易理解。缺點:存在單點問題、數據庫性可以開銷較大、不可重入;
- 基於緩存的分佈式鎖:優勢:非阻塞、性能好。缺點:操做很差容易形成鎖沒法釋放的狀況。
- Zookeeper 分佈式鎖:經過有序臨時節點實現鎖機制,本身對應的節點須要最小,則被認爲是得到了鎖。優勢:集羣能夠透明解決單點問題,避免鎖不被釋放問題,同時鎖能夠重入。缺點:性能不如緩存方式,吞吐量會隨着zk集羣規模變大而降低。
-
- 清楚的原理描述 + Java 代碼示例。
-
- 基於 setnx(set if ont exists),有則返回false,不然返回true。並支持過時時間。
-
- 利用 memcached 的 add(有別於set)操做,當key存在時,返回false。
分佈式一致性算法
PAXOS
Zab
Raft
- 《Raft 爲何是更易理解的分佈式一致性算法》
- 三種角色:Leader(領袖)、Follower(羣衆)、Candidate(候選人)
- 經過隨機等待的方式發出投票,得票多的獲勝。
Gossip
兩階段提交、多階段提交
冪等
- 《分佈式系統---冪等性設計》
- 冪等特性的做用:該資源具有冪等性,請求方無需擔憂重複調用會產生錯誤。
- 常見保證冪等的手段:MVCC(相似於樂觀鎖)、去重表(惟一索引)、悲觀鎖、一次性token、序列號方式。
分佈式一致方案
分佈式 Leader 節點選舉
TCC(Try/Confirm/Cancel) 柔性事務
- 《傳統事務與柔性事務》
- 基於BASE理論:基本可用、柔性狀態、最終一致。
- 解決方案:記錄日誌+補償(正向補充或者回滾)、消息重試(要求程序要冪等);「無鎖設計」、採用樂觀鎖機制。
分佈式文件系統
- 說說分佈式文件存儲系統-基本架構 ?
- 《各類分佈式文件系統的比較》 ?
- HDFS:大批量數據讀寫,用於高吞吐量的場景,不適合小文件。
- FastDFS:輕量級、適合小文件。
惟一ID 生成
全局惟一ID
-
- Twitter 方案(Snowflake 算法):41位時間戳+10位機器標識(好比IP,服務器名稱等)+12位序列號(本地計數器)
- Flicker 方案:MySQL自增ID + "REPLACE INTO XXX:SELECT LAST_INSERT_ID();"
- UUID:缺點,無序,字符串過長,佔用空間,影響檢索性能。
- MongoDB 方案:利用 ObjectId。缺點:不能自增。
-
- 在數據庫中建立 sequence 表,用於記錄,當前已被佔用的id最大值。
- 每臺客戶端主機取一個id區間(好比 1000~2000)緩存在本地,並更新 sequence 表中的id最大值記錄。
- 客戶端主機之間取不一樣的id區間,用完再取,使用樂觀鎖機制控制併發。
一致性Hash算法
設計思想 & 開發模式
DDD(Domain-driven Design - 領域驅動設計)
-
- 概念:DDD 主要對傳統軟件開發流程(分析-設計-編碼)中各階段的割裂問題而提出,避免因爲一開始分析不明或在軟件開發過程當中的信息流轉不一致而形成軟件沒法交付(和需求方設想不一致)的問題。DDD 強調一切以領域(Domain)爲中心,強調領域專家(Domain Expert)的做用,強調先定義好領域模型以後在進行開發,而且領域模型能夠指導開發(所謂的驅動)。
- 過程:理解領域、拆分領域、細化領域,模型的準確性取決於模型的理解深度。
- 設計:DDD 中提出了建模工具,好比聚合、實體、值對象、工廠、倉儲、領域服務、領域事件來幫助領域建模。
-
- 領域(Doamin)本質上就是問題域,好比一個電商系統,一個論壇系統等。
- 界限上下文(Bounded Context):闡述子域之間的關係,能夠簡單理解成一個子系統或組件模塊。
- 領域模型(Domain Model):DDD的核心是創建(用通用描述語言、工具—領域通用語言)正確的領域模型;反應業務需求的本質,包括實體和過程;其貫穿軟件分析、設計、開發 的整個過程;經常使用表達領域模型的方式:圖、代碼或文字;
- 領域通用語言:領域專家、開發設計人員都能當即的語言或工具。
- 經典分層架構:用戶界面/展現層、應用層、領域層、基礎設施層,是四層架構模式。
- 使用的模式:
- 關聯儘可能少,儘可能單項,儘可能下降總體複雜度。
- 實體(Entity):領域中的惟一標示,一個實體的屬性儘可能少,少則清晰。
- 值對象(Value Object):沒有惟一標識,且屬性值不可變,小二簡單的對象,好比Date。
- 領域服務(Domain Service): 協調多個領域對象,只有方法沒有狀態(不存數據);能夠分爲應用層服務,領域層服務、基礎層服務。
- 聚合及聚合根(Aggregate,Aggregate Root):聚合定義了一組具備內聚關係的相關對象的集合;聚合根是對聚合引用的惟一元素;當修改一個聚合時,必須在事務級別;大部分領域模型中,有70%的聚合一般只有一個實體,30%只有2~3個實體;若是一個聚合只有一個實體,那麼這個實體就是聚合根;若是有多個實體,那麼咱們能夠思考聚合內哪一個對象有獨立存在的意義而且能夠和外部直接進行交互;
- 工廠(Factory):相似於設計模式中的工廠模式。
- 倉儲(Repository):持久化到DB,管理對象,且只對聚合設計倉儲。
-
- 聚合:好比一輛汽車(Car)包含了引擎(Engine)、車輪(Wheel)和油箱(Tank)等組件,缺一不可。
命令查詢職責分離(CQRS)
CQRS — Command Query Responsibility Seperation
-
- 核心思想:讀寫分離(查詢和更新在不一樣的方法中),不一樣的流程只是不一樣的設計方式,CQ代碼分離,分佈式環境中會有明顯體現(有冗餘數據的狀況下),目的是爲了高性能。
-
- 最終一致的設計理念;依賴於高可用消息中間件。
-
- 一個實現 CQRS 的抽象案例。
-
《深度長文:我對CQRS/EventSourcing架構的思考》
- CQRS 模式分析 + 12306 搶票案例
貧血,充血模型
- 《貧血,充血模型的解釋以及一些經驗》
- 失血模型:老子和兒子分別定義,相互不知道,兩者實體定義中徹底沒有業務邏輯,經過外部Service進行關聯。
- 貧血模型:老子知道兒子,兒子也知道老子;部分業務邏輯放到實體中;優勢:各層單項依賴,結構清楚,易於維護;缺點:不符合OO思想,相比於充血模式,Service層較爲厚重;
- 充血模型:和貧血模型相似,區別在於如何劃分業務邏輯。優勢:Service層比較薄,只充當Facade的角色,不和DAO打交道、複合OO思想;缺點:非單項依賴,DO和DAO之間雙向依賴、和Service層的邏輯劃分容易形成混亂。
- 腫脹模式:是一種極端狀況,取消Service層、所有業務邏輯放在DO中;優勢:符合OO思想、簡化了分層;缺點:暴露信息過多、不少非DO邏輯也會強行併入DO。這種模式應該避免。
- 做者主張使用貧血模式。
Actor 模式
TODO
響應式編程
TODO
DODAF2.0
Serverless
TODO
項目管理
架構評審
重構
代碼規範
TODO
RUP
看板管理
SCRUM
極限編程
TODO
敏捷開發
TODO
結對編程
TODO
FMEA管理模式
TODO
通用業務術語
TODO
技術趨勢
TODO
架構師素質
-
- 業務理解和抽象能力
- NB的代碼能力
- 全面:1. 在面對業務問題上,架構師腦海裏是否會浮現出多種技術方案;2. 在作系統設計時是否考慮到了足夠多的方方面面;3. 在作系統設計時是否考慮到了足夠多的方方面面;
- 全局:是否考慮到了對上下游的系統的影響。
- 權衡:權衡投入產出比;優先級和節奏控制;
-
- 要去考慮的細節:模塊化、輕耦合、無共享架構;減小各個組件以前的依懶、注意服務之間依懶全部形成的鏈式失敗及影響等。
- 基礎設施、配置、測試、開發、運維綜合考慮。
- 考慮人、團隊、和組織的影響。
-
- 素質:業務理解、技術廣度、技術深度、豐富經驗、溝通能力、動手能力、美學素養。
- 成長路徑:2年積累知識、4年積累技能和祖內影響力、7年積累部門內影響力、7年以上積累跨部門影響力。
-
- 第一層的架構師看到的只是產品自己
- 第二層的架構師不只看到本身的產品,還看到了總體的方案
- 第三層的架構師看到的是商業價值
團隊管理
TODO
招聘
資訊
行業資訊
公衆號列表
TODO
博客
團隊博客
我的博客
綜合門戶、社區
國內:
-
CSDN 老牌技術社區、沒必要解釋。
-
- 偏 Java 方向
-
- 偏 Linux 方向
-
- 涵蓋 IT職場、Web前端、後端、移動端、數據庫等方面內容,偏技術端。
國外:
問答、討論類社區
- segmentfault
- 問答+專欄
- 知乎
- stackoverflow
行業數據分析
專項網站
-
測試:
-
運維:
-
Java:
- ImportNew
- 專一於 Java 技術分享
- HowToDoInJava
- 英文博客
- ImportNew
-
安全
-
大數據
-
其餘專題網站:
- DockerInfo
- 專一於 Docker 應用及諮詢、教程的網站。
- Linux公社
- Linux 主題社區
- DockerInfo
其餘類
推薦參考書
在線電子書
紙質書
開發方面
架構方面
- 《軟件架構師的12項修煉:技術技能篇》 京東 淘寶
- 《架構之美》 京東 淘寶
- 《分佈式服務架構》 京東 淘寶
- 《聊聊架構》 京東 淘寶
- 《雲原生應用架構實踐》 京東 淘寶
- 《億級流量網站架構核心技術》 京東 淘寶
- 《淘寶技術這十年》 京東 淘寶
- 《企業IT架構轉型之道-中臺戰略思想與架構實戰》 京東 淘寶
技術管理方面
基礎理論
工具方面
TODO
大數據方面
技術資源
開源資源
手冊、文檔、教程
國內:
-
- HTML 、 CSS、XML、Java、Python、PHP、設計模式等入門手冊。
-
- 不少不少中文在線電子書,是一個全新的開源技術文檔分享平臺。
-
- 付費電子書。
-
- AI、大數據方面系列中文文檔。
國外:
- Quick Code
- 免費在線技術教程。
- gitbook.com
- 有部分中文電子書。
- Cheatography
- Cheat Sheets 大全,單頁文檔網站。
在線課堂
會議、活動
活動發佈平臺:
經常使用APP
找工做
工具
- 極客搜索
- 技術文章搜索引擎。
代碼託管
文件服務
- 七牛
- 又拍雲
綜合雲服務商
- 阿里雲
- 騰訊雲
- 百度雲
- 新浪雲
- 金山雲