摘自 後端架構師技術圖譜 ,希望為這麼好的文章增加曝光度
《後端架構師技術圖譜》
推薦: 《Java技術書籍大全》 - awesome-java-books
從初級開發者到資深架構師,看這些書就夠了
- 資料結構
- 常用演算法
- 併發
- 作業系統
- 設計模式
- 運維 & 統計 & 技術支援
- 中介軟體
- 網路
- 資料庫
- 搜尋引擎
- 效能
- 大資料
- 安全
- 常用開源框架
- 分散式設計
- 設計思想 & 開發模式
- 專案管理
- 通用業務術語
- 技術趨勢
- 政策、法規
- 架構師素質
- 團隊管理
- 資訊
- 技術資源
(Toc generated by simple-php-github-toc )
資料結構
佇列
-
- 非阻塞佇列:ConcurrentLinkedQueue(無界執行緒安全),採用CAS機制(compareAndSwapObject原子操作)。
- 阻塞佇列:ArrayBlockingQueue(有界)、LinkedBlockingQueue(無界)、DelayQueue、PriorityBlockingQueue,採用鎖機制;使用 ReentrantLock 鎖。
集合
連結串列、陣列
字典、關聯陣列
棧
- 《java資料結構與演算法之棧(Stack)設計與實現》
- 《Java Stack 類》
- 《java stack的詳細實現分析》
- Stack 是執行緒安全的。
- 內部使用陣列儲存資料,不夠時翻倍。
樹
二叉樹
每個節點最多有兩個葉子節點。
完全二叉樹
- 《完全二叉樹》
- 葉節點只能出現在最下層和次下層,並且最下面一層的結點都集中在該層最左邊的若干位置的二叉樹。
平衡二叉樹
左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。
二叉查詢樹(BST)
二叉查詢樹(Binary Search Tree),也稱有序二叉樹(ordered binary tree),排序二叉樹(sorted binary tree)。
紅黑樹
- 《最容易懂得紅黑樹》
- 新增階段後,左旋或者右旋從而再次達到平衡。
- 《淺談演算法和資料結構: 九 平衡查詢樹之紅黑樹》
B,B+,B*樹
MySQL是基於B+樹聚集索引組織表
- 《B-樹,B+樹,B*樹詳解》
- 《B-樹,B+樹與B*樹的優缺點比較》
- B+樹的葉子節點連結串列結構相比於 B-樹便於掃庫,和範圍檢索。
LSM 樹
LSM(Log-Structured Merge-Trees)和 B+ 樹相比,是犧牲了部分讀的效能來換取寫的效能(通過批量寫入),實現讀寫之間的平衡。 Hbase、LevelDB、Tair(Long DB)、nessDB 採用 LSM 樹的結構。LSM可以快速建立索引。
-
- B+ 樹讀效能好,但由於需要有序結構,當key比較分散時,磁碟尋道頻繁,造成寫效能較差。
- LSM 是將一個大樹拆分成N棵小樹,先寫到記憶體(無尋道問題,效能高),在記憶體中構建一顆有序小樹(有序樹),隨著小樹越來越大,記憶體的小樹會flush到磁碟上。當讀時,由於不知道資料在哪棵小樹上,因此必須遍歷(二分查詢)所有的小樹,但在每顆小樹內部資料是有序的。
-
《LSM樹(Log-Structured Merge Tree)儲存引擎》
- 極端的說,基於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演算法。
字串比較
KMP 演算法
KMP:Knuth-Morris-Pratt演算法(簡稱KMP) 核心原理是利用一個“部分匹配表”,跳過已經匹配過的元素。
深度優先、廣度優先
貪心演算法
回溯演算法
剪枝演算法
動態規劃
樸素貝葉斯
-
- P(B|A)=P(A|B)P(B)/P(A)
推薦演算法
最小生成樹演算法
最短路徑演算法
併發
Java 併發
多執行緒
執行緒安全
一致性、事務
事務 ACID 特性
事務的隔離級別
-
未提交讀:一個事務可以讀取另一個未提交的資料,容易出現髒讀的情況。
-
讀提交:一個事務等另外一個事務提交之後才可以讀取資料,但會出現不可重複讀的情況(多次讀取的資料不一致),讀取過程中出現UPDATE操作,會多。(大多數資料庫預設級別是RC,比如SQL Server,Oracle),讀取的時候不可以修改。
-
可重複讀: 同一個事務裡確保每次讀取的時候,獲得的是同樣的資料,但不保障原始資料被其他事務更新(幻讀),Mysql InnoDB 就是這個級別。
-
序列化:所有事物序列處理(犧牲了效率)
-
- 幻讀的例子非常清楚。
- 通過 SELECT ... FOR UPDATE 解決。
-
- 圖解髒讀、不可重複讀、幻讀問題。
MVCC
-
- innodb 中 MVCC 用在 Repeatable-Read 隔離級別。
- MVCC 會產生幻讀問題(更新時異常。)
-
- 通過隱藏版本列來實現 MVCC 控制,一列記錄建立時間、一列記錄刪除時間,這裡的時間
- 每次只操作比當前版本小(或等於)的 行。
鎖
Java中的鎖和同步類
-
- 主要包括 synchronized、ReentrantLock、和 ReadWriteLock。
-
- 有數量控制
- 申請用 acquire,申請不要則阻塞;釋放用 release。
-
- 簡單的說 就是Mutex是排它的,只有一個可以獲取到資源, Semaphore也具有排它性,但可以定義多個可以獲取的資源的物件。
公平鎖 & 非公平鎖
公平鎖的作用就是嚴格按照執行緒啟動的順序來執行的,不允許其他執行緒插隊執行的;而非公平鎖是允許插隊的。
- 《公平鎖與非公平鎖》
- 預設情況下 ReentrantLock 和 synchronized 都是非公平鎖。ReentrantLock 可以設定成公平鎖。
悲觀鎖
悲觀鎖如果使用不當(鎖的條數過多),會引起服務大面積等待。推薦優先使用樂觀鎖+重試。
-
- 樂觀鎖的方式:版本號+重試方式
- 悲觀鎖:通過 select ... for update 進行行鎖(不可讀、不可寫,share 鎖可讀不可寫)。
-
《Mysql查詢語句使用select.. for update導致的資料庫死鎖分析》
- mysql的innodb儲存引擎實務鎖雖然是鎖行,但它內部是鎖索引的。
- 鎖相同資料的不同索引條件可能會引起死鎖。
樂觀鎖 & CAS
- 《樂觀鎖的一種實現方式——CAS》
- 和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 可以顯示死鎖。
作業系統
計算機原理
CPU
多級快取
典型的 CPU 有三級快取,距離核心越近,速度越快,空間越小。L1 一般 32k,L2 一般 256k,L3 一般12M。記憶體速度需要200個 CPU 週期,CPU 快取需要1個CPU週期。
程式
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(大規模分散式系統的跟蹤系統) 思想。
統計分析
-
- 常用指標:訪問與訪客、停留時長、跳出率、退出率、轉化率、參與度
-
- 第三方統計:友盟、百度移動、魔方、App Annie、talking data、神策資料等。
-
- 所謂無痕、即通過視覺化工具配置採集節點,在前端自動解析配置並上報埋點資料,而非硬編碼。
持續整合(CI/CD)
Jenkins
環境分離
開發、測試、生成環境分離。
自動化運維
Ansible
puppet
chef
測試
TDD 理論
- 《深度解讀 - TDD(測試驅動開發)》
- 基於測試用例編碼功能程式碼,XP(Extreme Programming)的核心實踐.
- 好處:一次關注一個點,降低思維負擔;迎接需求變化或改善程式碼的設計;提前澄清需求;快速反饋;
單元測試
- 《Java單元測試之JUnit篇》
- 《JUnit 4 與 TestNG 對比》
- TestNG 覆蓋 JUnit 功能,適用於更復雜的場景。
- 《單元測試主要的測試功能點》
- 模組介面測試、區域性資料結構測試、路徑測試 、錯誤處理測試、邊界條件測試 。
壓力測試
全鏈路壓測
A/B 、灰度、藍綠測試
虛擬化
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上進行開發。
- agentzh 的 Nginx 教程
Tengine
Apache Httpd
Tomcat
架構原理
-
《JBoss vs. Tomcat: Choosing A Java Application Server》
- Tomcat 是輕量級的 Serverlet 容器,沒有實現全部 JEE 特性(比如持久化和事務處理),但可以通過其他元件代替,比如Spring。
- 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 引數。
服務端快取
Web快取
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 檔案。
-
- 關於協議的解釋;缺點:可讀性差;
-
- protostuff 的好處是不用寫 .proto 檔案,Java 物件直接就可以序列化。
資料庫
基礎理論
關聯式資料庫設計的三大正規化
- 《資料庫的三大正規化以及五大約束》
- 第一正規化:資料表中的每一列(每個欄位)必須是不可拆分的最小單元,也就是確保每一列的原子性;
- 第二正規化(2NF):滿足1NF後,要求表中的所有列,都必須依賴於主鍵,而不能有任何一列與主鍵沒有關係,也就是說一個表只描述一件事情;
- 第三正規化:必須先滿足第二正規化(2NF),要求:表中的每一列只與主鍵直接相關而不是間接相關,(表中的每一列只能依賴於主鍵);
MySQL
原理
-
- 兩種型別最主要的差別就是Innodb 支援事務處理與外來鍵和行級鎖
InnoDB
優化
-
- 原則上就是縮小掃描範圍。
索引
聚集索引, 非聚集索引
MyISAM 是非聚集,InnoDB 是聚集
複合索引
-
- 文中有一處錯誤:
對於複合索引,在查詢使用時,最好將條件順序按找索引的順序,這樣效率最高; select * from table1 where col1=A AND col2=B AND col3=D 如果使用 where col2=B AND col1=A 或者 where col2=B 將不會使用索引
- 原文中提到索引是按照“col1,col2,col3”的順序建立的,而mysql在按照最左字首的索引匹配原則,且會自動優化 where 條件的順序,當條件中只有 col2=B AND col1=A 時,會自動轉化為 col1=A AND col2=B,所以依然會使用索引。
自適應雜湊索引(AHI)
explain
NoSQL
MongoDB
- MongoDB 教程
- 《Mongodb相對於關係型資料庫的優缺點》
- 優點:弱一致性(最終一致),更能保證使用者的訪問速度;內建GridFS,支援大容量的儲存;Schema-less 資料庫,不用預先定義結構;內建Sharding;相比於其他NoSQL,第三方支援豐富;效能優越;
- 缺點:mongodb不支援事務操作;mongodb佔用空間過大;MongoDB沒有如MySQL那樣成熟的維護工具,這對於開發和IT運營都是個值得注意的地方;
Hbase
-
- 空資料不儲存,節省空間,且適用於併發。
-
- rowkey 按照字典順序排列,便於批量掃描。
- 通過雜湊可以避免熱點。
搜尋引擎
搜尋引擎原理
Lucene
Elasticsearch
Solr
sphinx
效能
效能優化方法論
-
- 程式碼層面、業務層面、資料庫層面、伺服器層面、前端優化。
容量評估
- 《聯網效能與容量評估的方法論和典型案例》
- 《網際網路架構,如何進行容量設計?》
- 評估總訪問量、評估平均訪問量QPS、評估高峰QPS、評估系統、單機極限QPS
CDN 網路
連線池
效能調優
大資料
流式計算
Storm
Flink
Kafka Stream
應用場景
例如:
- 廣告相關實時統計;
- 推薦系統使用者畫像標籤實時更新;
- 線上服務健康狀況實時監測;
- 實時榜單;
- 實時資料統計。
Hadoop
HDFS
MapReduce
Yarn
Spark
安全
web 安全
XSS
CSRF
SQL 注入
Hash Dos
- 《邪惡的JAVA HASH DOS攻擊》
- 利用JsonObject 上傳大Json,JsonObject 底層使用HashMap;不同的資料產生相同的hash值,使得構建Hash速度變慢,耗盡CPU。
- 《一種高階的DoS攻擊-Hash碰撞攻擊》
- 《關於Hash Collision DoS漏洞:解析與解決方案》
指令碼注入
漏洞掃描工具
驗證碼
-
- 滑動驗證碼是根據人在滑動滑塊的響應時間,拖拽速度,時間,位置,軌跡,重試次數等來評估風險。
DDoS 防範
使用者隱私資訊保護
- 使用者密碼非明文儲存,加動態salt。
- 身份證號,手機號如果要顯示,用 “*” 替代部分字元。
- 聯絡方式在的顯示與否由使用者自己控制。
- 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
雙因素認證(2FA)
2FA - Two-factor authentication,用於加強登入驗證
常用做法是 登入密碼 + 手機驗證碼(或者令牌Key,類似於與網銀的 USB key)
- 【《雙因素認證(2FA)教程》】(www.ruanyifeng.com/blog/2017/1…)
單點登入(SSO)
常用開源框架
開源協議
日誌框架
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、Spring、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
響應式程式設計
Reactor
TODO
RxJava
TODO
Vert.x
TODO
DODAF2.0
Serverless
無需過多關係伺服器的服務架構理念。
-
- Serverless 不代表出去伺服器,而是去除對伺服器執行狀態的關心。
- Serverless 代表一思維方式的轉變,從“構建一套服務在一臺伺服器上,對對個事件進行響應轉變為構建一個為伺服器,來響應一個事件”。
- Serverless 不代表某個具體的框架。
-
- 依賴於 Baas ((Mobile) Backend as a Service) 和 Faas (Functions as a service)
Service Mesh
專案管理
架構評審
重構
程式碼規範
程式碼 Review
制度還是制度! 另外,每個公司需要根據自己的需求和目標制定自己的 check list
-
- 程式碼 review 做的好,在於制度建設。
RUP
看板管理
SCRUM
SCRUM - 爭球
-
3個角色:Product Owner(PO) 產品負責人;Scrum Master(SM),推動Scrum執行;Team 開發團隊。
-
3個工件:Product Backlog 產品TODOLIST,含優先順序;Sprint Backlog 功能開發 TODO LIST;燃盡圖;
-
五個價值觀:專注、勇氣、公開、承諾、尊重。
敏捷開發
TODO
極限程式設計(XP)
XP - eXtreme Programming
- 《主流敏捷開發方法:極限程式設計XP》
-
是一種指導開發人員的方法論。
-
4大價值:
- 溝通:鼓勵口頭溝通,提高效率。
- 簡單:夠用就好。
- 反饋:及時反饋、通知相關人。
- 勇氣:提倡擁抱變化,敢於重構。
-
5個原則:快速反饋、簡單性假設、逐步修改、提倡更改(小步快跑)、優質工作(保證質量的前提下保證小步快跑)。
-
5個工作:階段性衝刺;衝刺計劃會議;每日站立會議;衝刺後review;回顧會議。
-
結對程式設計
邊寫碼,邊review。能夠增強程式碼質量、減少bug。
PDCA 迴圈質量管理
P——PLAN 策劃,D——DO 實施,C——CHECK 檢查,A——ACT 改進
FMEA管理模式
TODO
通用業務術語
TODO
技術趨勢
TODO
政策、法規
法律
-
- 2016年11月7日釋出,自2017年6月1日起施行
-
- 個人資訊保護法是一部保護個人資訊的法律條款,現尚在制訂中,2019全國兩會資訊保安相關提案中,有政協委員呼籲關注大資料時代隱私保護,加速立法。
-
《最高人民法院、最高人民檢察院關於辦理侵犯公民個人資訊刑事案件適用法律若干問題的解釋》
- 《解釋》共十三條,自2017年6月1日起施行
- 1、對於行蹤軌跡資訊、通訊內容、徵信資訊、財產資訊,非法獲取、出售或者提供50條以上即算“情節嚴重”;
- 2、對於住宿資訊、通訊記錄、健康生理資訊、交易資訊等其他可能影響人身、財產安全的公民個人資訊,標準則是 500條以上;
- 3、對於其他公民個人資訊,標準為 5000條以上。
-
- 2018年8月31日,十三屆全國人大常委會第五次會議表決通過《電子商務法》,自2019年1月1日起施行
- 解讀電子商務法(一)什麼是電商
- 解讀電子商務法(二)電商經營者
- 解讀電子商務法(三)電商行為規範
- 解讀電子商務法(四)電商的法律關係
- 解讀電子商務法(外傳)電商掙錢的祕密
- 解讀電子商務法(外傳)電商模式
嚴格遵守刑法253法條
我國刑法第253條之一規定:
- 國家機關或者金融、電信、交通、教育、醫療等單位的工作人員,違反國家規定,將本單位在履行職責或者提供服務過程中獲得的公民個人資訊,出售或者非法提供給他人,情節嚴重的,處3年以下有期徒刑或者拘役,並處或者單處罰金。
- 竊取或者以其他方法非法獲取上述資訊,情節嚴重的,依照前款的規定處罰。
- 單位犯前兩款罪的,對單位判處罰金,並對其直接負責的主管人員和其他直接責任人員,依照各該款的規定處罰。
最高人民法院、最高人民檢察院關於執行《中華人民共和國刑法》確定罪名的補充規定(四)規定:觸犯刑法第253條之一第1款之規定,構成“出售、非法提供公民個人資訊罪”;觸犯刑法第253條之一第2款之規定,構成“非法獲取公民個人資訊罪”
避風港原則
“避風港”原則是指在發生著作權侵權案件時,當ISP(網路服務提供商)只提供空間服務,並不製作網頁內容,如果ISP被告知侵權,則有刪除的義務,否則就被視為侵權。如果侵權內容既不在ISP的伺服器上儲存,又沒有被告知哪些內容應該刪除,則ISP不承擔侵權責任。 後來避風港原則也被應用在搜尋引擎、網路儲存、線上圖書館等方面。
架構師素質
-
- 業務理解和抽象能力
- NB的程式碼能力
- 全面:1. 在面對業務問題上,架構師腦海裡是否會浮現出多種技術方案;2. 在做系統設計時是否考慮到了足夠多的方方面面;3. 在做系統設計時是否考慮到了足夠多的方方面面;
- 全域性:是否考慮到了對上下游的系統的影響。
- 權衡:權衡投入產出比;優先順序和節奏控制;
-
- 要去考慮的細節:模組化、輕耦合、無共享架構;減少各個元件之前的依賴、注意服務之間依賴所有造成的鏈式失敗及影響等。
- 基礎設施、配置、測試、開發、運維綜合考慮。
- 考慮人、團隊、和組織的影響。
-
- 素質:業務理解、技術廣度、技術深度、豐富經驗、溝通能力、動手能力、美學素養。
- 成長路徑:2年積累知識、4年積累技能和組內影響力、7年積累部門內影響力、7年以上積累跨部門影響力。
-
- 第一層的架構師看到的只是產品本身
- 第二層的架構師不僅看到自己的產品,還看到了整體的方案
- 第三層的架構師看到的是商業價值
團隊管理
TODO
招聘
資訊
行業資訊
公眾號列表
TODO
部落格
團隊部落格
個人部落格
綜合門戶、社群
國內:
-
CSDN 老牌技術社群、不必解釋。
-
- 偏 Java 方向
-
- 偏 Linux 方向
-
- 涵蓋 IT職場、Web前端、後端、移動端、資料庫等方面內容,偏技術端。
國外:
問答、討論類社群
- segmentfault
- 問答+專欄
- 知乎
- stackoverflow
行業資料分析
專項網站
-
測試:
-
運維:
-
Java:
- ImportNew
- 專注於 Java 技術分享
- HowToDoInJava
- 英文部落格
- ImportNew
-
安全
-
大資料
-
其他專題網站:
- InfoQ
- 偏重於基礎架構、運維方向
- DockerInfo
- 專注於 Docker 應用及諮詢、教程的網站
- Linux公社
- Linux 主題社群
- InfoQ
其他類
推薦參考書
線上電子書
紙質書
更多架構方面書籍參考: awesome-java-books
開發方面
- 《阿里巴巴Java開發手冊》詳情
架構方面
-
《軟體架構師的12項修煉:技術技能篇》詳情
-
《架構之美》詳情
-
《分散式服務架構》詳情
-
《聊聊架構》 詳情
-
《雲原生應用架構實踐》詳情
-
《億級流量網站架構核心技術》詳情
-
《淘寶技術這十年》詳情
-
《企業IT架構轉型之道-中臺戰略思想與架構實戰》 詳情
-
《高可用架構(第1卷)》詳情
技術管理方面
基礎理論
工具方面
TODO
大資料方面
技術資源
開源資源
手冊、文件、教程
國內:
-
- HTML 、 CSS、XML、Java、Python、PHP、設計模式等入門手冊。
-
- 很多很多中文線上電子書,是一個全新的開源技術文件分享平臺。
-
- 付費電子書。
-
- AI、大資料方面系列中文文件。
國外:
- Quick Code
- 免費線上技術教程。
- gitbook.com
- 有部分中文電子書。
- Cheatography
- Cheat Sheets 大全,單頁文件網站。
- Tutorialspoint
- 知名教程網站,提供Java、Python、JS、SQL、大資料等高質量入門教程。
線上課堂
會議、活動
活動釋出平臺:
常用APP
找工作
工具
- 極客搜尋
- 技術文章搜尋引擎。
程式碼託管
檔案服務
- 七牛
- 又拍雲