- 數(shù)據(jù)結構
- 常用算法
- 并發(fā)
- 操作系統(tǒng)
- 設計模式
- 運維 & 統(tǒng)計 & 技術支持
- 中間件
- 網絡
- 數(shù)據(jù)庫
- 搜索引擎
- 性能
- 大數(shù)據(jù)
- 安全
- 常用開源框架
- 分布式設計
- 設計思想 & 開發(fā)模式
- 項目管理
- 通用業(yè)務術語
- 技術趨勢
- 政策华烟、法規(guī)
- 架構師素質
- 團隊管理
- 資訊
- 技術資源
(Toc generated by simple-php-github-toc )
數(shù)據(jù)結構
隊列
-
- 非阻塞隊列:ConcurrentLinkedQueue(無界線程安全)比吭,采用CAS機制(compareAndSwapObject原子操作)绽族。
- 阻塞隊列:ArrayBlockingQueue(有界)、LinkedBlockingQueue(無界)衩藤、DelayQueue吧慢、PriorityBlockingQueue,采用鎖機制赏表;使用 ReentrantLock 鎖检诗。
《LinkedList匈仗、ConcurrentLinkedQueue、LinkedBlockingQueue對比分析》
集合
鏈表逢慌、數(shù)組
字典悠轩、關聯(lián)數(shù)組
棧
- 《java數(shù)據(jù)結構與算法之棧(Stack)設計與實現(xiàn)》
- 《Java Stack 類》
-
《java stack的詳細實現(xiàn)分析》
- Stack 是線程安全的。
- 內部使用數(shù)組保存數(shù)據(jù)忙菠,不夠時翻倍何鸡。
樹
二叉樹
每個節(jié)點最多有兩個葉子節(jié)點。
完全二叉樹
-
《完全二叉樹》
- 葉節(jié)點只能出現(xiàn)在最下層和次下層牛欢,并且最下面一層的結點都集中在該層最左邊的若干位置的二叉樹骡男。
平衡二叉樹
左右兩個子樹的高度差的絕對值不超過1,并且左右兩個子樹都是一棵平衡二叉樹傍睹。
二叉查找樹(BST)
二叉查找樹(Binary Search Tree)隔盛,也稱有序二叉樹(ordered binary tree),排序二叉樹(sorted binary tree)。
紅黑樹
-
《最容易懂得紅黑樹》
- 添加階段后拾稳,左旋或者右旋從而再次達到平衡吮炕。
- 《淺談算法和數(shù)據(jù)結構: 九 平衡查找樹之紅黑樹》
B-,B+熊赖,B*樹
MySQL是基于B+樹聚集索引組織表
- 《B-樹,B+樹虑椎,B*樹詳解》
-
《B-樹震鹉,B+樹與B*樹的優(yōu)缺點比較》
- B+ 樹的葉子節(jié)點鏈表結構相比于 B- 樹便于掃庫,和范圍檢索捆姜。
LSM 樹
LSM(Log-Structured Merge-Trees)和 B+ 樹相比传趾,是犧牲了部分讀的性能來換取寫的性能(通過批量寫入),實現(xiàn)讀寫之間的泥技。
Hbase浆兰、LevelDB、Tair(Long DB)珊豹、nessDB 采用 LSM 樹的結構簸呈。LSM可以快速建立索引。
-
- B+ 樹讀性能好店茶,但由于需要有序結構蜕便,當key比較分散時,磁盤尋道頻繁贩幻,造成寫性能轿腺。
- LSM 是將一個大樹拆分成N棵小樹两嘴,先寫到內存(無尋道問題,性能高)族壳,在內存中構建一顆有序小樹(有序樹)憔辫,隨著小樹越來越大,內存的小樹會flush到磁盤上仿荆。當讀時贰您,由于不知道數(shù)據(jù)在哪棵小樹上,因此必須遍歷(二分查找)所有的小樹赖歌,但在每顆小樹內部數(shù)據(jù)是有序的枉圃。
-
《LSM樹(Log-Structured Merge Tree)存儲引擎》
- 極端的說,基于LSM樹實現(xiàn)的HBase的寫性能比MySQL高了一個數(shù)量級庐冯,讀性能低了一個數(shù)量級孽亲。
- 優(yōu)化方式:Bloom filter 替代二分查找;compact 小數(shù)位大樹展父,提高查詢性能返劲。
- Hbase 中,內存中達到一定閾值后栖茉,整體flush到磁盤上篮绿、形成一個文件(B+數(shù)),HDFS不支持update操作吕漂,所以Hbase做整體flush而不是merge update亲配。flush到磁盤上的小樹,定期會合并成一個大樹惶凝。
BitSet
經常用于大規(guī)模數(shù)據(jù)的排重檢查吼虎。
常用算法
排序、查找算法
選擇排序
-
《Java中的經典算法之選擇排序(SelectionSort)》
- 每一趟從待排序的記錄中選出最小的元素苍鲜,順序放在已排好序的序列最后思灰,直到全部記錄排序完畢。
冒泡排序
-
《冒泡排序的2種寫法》
- 相鄰元素前后交換混滔、把最大的排到最后洒疚。
- 時間復雜度 O(n2)
插入排序
快速排序
-
《坐在馬桶上看算法:快速排序》
- 一側比另外一次都大或小。
歸并排序
-
《圖解排序算法(四)之歸并排序》
- 分而治之坯屿,分成小份排序油湖,在合并(重建一個新空間進行復制)。
希爾排序
TODO
堆排序
-
《圖解排序算法(三)之堆排序》
- 排序過程就是構建最大堆的過程领跛,最大堆:每個結點的值都大于或等于其左右孩子結點的值肺魁,堆頂元素是最大值。
計數(shù)排序
-
《計數(shù)排序和桶排序》
- 和桶排序過程比較像隔节,差別在于桶的數(shù)量鹅经。
桶排序
- 《【啊哈寂呛!算法】最快最簡單的排序——桶排序》
-
《排序算法(三):計數(shù)排序與桶排序》
- 桶排序將[0,1)區(qū)間劃分為n個相同的大小的子區(qū)間,這些子區(qū)間被稱為桶瘾晃。
- 每個通單獨進行排序贷痪,然后再遍歷每個桶。
基數(shù)排序
按照個位蹦误、十位劫拢、百位、...依次來排强胰。
二分查找
-
- 要求待查找的序列有序舱沧。
- 時間復雜度 O(logN)。
-
- while + 遞歸偶洋。
Java 中的排序工具
-
《Arrays.sort和Collections.sort實現(xiàn)原理解析》
- Collections.sort算法調用的是合并排序熟吏。
- Arrays.sort() 采用了2種排序算法 -- 基本類型數(shù)據(jù)使用快速排序法,對象數(shù)組使用歸并排序玄窝。
布隆過濾器
常用于大數(shù)據(jù)的排重牵寺,比如email,url 等恩脂。
核心原理:將每條數(shù)據(jù)通過計算產生一個指紋(一個字節(jié)或多個字節(jié)帽氓,但一定比原始數(shù)據(jù)要少很多)瘫证,其中每一位都是通過隨機計算獲得榨馁,在將指紋映射到一個大的按位存儲的空間中。注意:會有一定的錯誤率陶耍。
優(yōu)點:空間和時間效率都很高玉凯。
缺點:隨著存入的元素數(shù)量增加势腮,誤算率隨之增加。
- 《布隆過濾器 -- 空間效率很高的數(shù)據(jù)結構》
- 《大量數(shù)據(jù)去重:Bitmap和布隆過濾器(Bloom Filter)》
-
《基于Redis的布隆過濾器的實現(xiàn)》
- 基于 Redis 的 Bitmap 數(shù)據(jù)結構壮啊。
-
《網絡爬蟲:URL去重策略之布隆過濾器(BloomFilter)的使用》
- 使用Java中的 BitSet 類 和 加權和hash算法嫉鲸。
字符串比較
KMP 算法
KMP:Knuth-Morris-Pratt算法(簡稱KMP)
核心原理是利用一個“部分匹配表”撑蒜,跳過已經匹配過的元素歹啼。
深度優(yōu)先、廣度優(yōu)先
貪心算法
回溯算法
剪枝算法
動態(tài)規(guī)劃
樸素貝葉斯
-
- P(B|A)=P(A|B)P(B)/P(A)
推薦算法
最小生成樹算法
最短路徑算法
并發(fā)
多線程
線程安全
一致性座菠、事務
事務 ACID 特性
事務的隔離級別
未提交讀:一個事務可以讀取另一個未提交的數(shù)據(jù)狸眼,容易出現(xiàn)臟讀的情況。
讀提交:一個事務等另外一個事務提交之后才可以讀取數(shù)據(jù)浴滴,但會出現(xiàn)不可重復讀的情況(多次讀取的數(shù)據(jù)不一致)拓萌,讀取過程中出現(xiàn)UPDATE操作,會多升略。(大多數(shù)數(shù)據(jù)庫默認級別是RC微王,比如SQL Server屡限,Oracle),讀取的時候不可以修改炕倘。
可重復讀: 同一個事務里確保每次讀取的時候钧大,獲得的是同樣的數(shù)據(jù),但不保障原始數(shù)據(jù)被其他事務更新(幻讀)罩旋,Mysql InnoDB 就是這個級別啊央。
序列化:所有事物串行處理(犧牲了效率)
-
- 幻讀的例子非常清楚。
- 通過 SELECT ... FOR UPDATE 解決涨醋。
-
- 圖解臟讀瓜饥、不可重復讀、幻讀問題浴骂。
MVCC
-
- innodb 中 MVCC 用在 Repeatable-Read 隔離級別乓土。
- MVCC 會產生幻讀問題(更新時異常。)
-
- 通過隱藏版本列來實現(xiàn) MVCC 控制靠闭,一列記錄創(chuàng)建時間帐我、一列記錄刪除時間,這里的時間
- 每次只操作比當前版本欣颉(或等于)的 行拦键。
鎖
Java中的鎖和同步類
-
- 主要包括 synchronized、ReentrantLock檩淋、和 ReadWriteLock芬为。
-
- 有數(shù)量控制
- 申請用 acquire,申請不要則阻塞蟀悦;釋放用 release媚朦。
-
《java開發(fā)中的Mutex vs Semaphore》
- 簡單的說 就是Mutex是排它的,只有一個可以獲取到資源日戈, Semaphore也具有排它性询张,但可以定義多個可以獲取的資源的對象。
公平鎖 & 非公平鎖
公平鎖的作用就是嚴格按照線程啟動的順序來執(zhí)行的浙炼,不允許其他線程插隊執(zhí)行的份氧;而非公平鎖是允許插隊的。
-
《公平鎖與非公平鎖》
- 默認情況下 ReentrantLock 和 synchronized 都是非公平鎖弯屈。ReentrantLock 可以設置成公平鎖蜗帜。
悲觀鎖
悲觀鎖如果使用不當(鎖的條數(shù)過多),會引起服務大面積等待资厉。推薦優(yōu)先使用樂觀鎖+重試厅缺。
-
- 樂觀鎖的方式:版本號+重試方式
- 悲觀鎖:通過 select ... for update 進行行鎖(不可讀、不可寫,share 鎖可讀不可寫)湘捎。
-
《Mysql查詢語句使用select.. for update導致的數(shù)據(jù)庫死鎖分析》
- mysql的innodb存儲引擎實務鎖雖然是鎖行诀豁,但它內部是鎖索引的。
- 鎖相同數(shù)據(jù)的不同索引條件可能會引起死鎖窥妇。
樂觀鎖 & CAS
-
《樂觀鎖的一種實現(xiàn)方式——CAS》
- 和MySQL樂觀鎖方式相似且叁,只不過是通過和原值進行比較。
ABA 問題
由于高并發(fā)秩伞,在CAS下逞带,更新后可能此A非彼A。通過版本號可以解決纱新,類似于上文Mysql 中提到的的樂觀鎖展氓。
- 《Java CAS 和ABA問題》
-
《Java 中 ABA問題及避免》
- AtomicStampedReference 和 AtomicStampedReference。
CopyOnWrite容器
可以對CopyOnWrite容器進行并發(fā)的讀脸爱,而不需要加鎖遇汞。CopyOnWrite并發(fā)容器用于讀多寫少的并發(fā)場景。比如白名單簿废,黑名單空入,商品類目的訪問和更新場景,不適合需要數(shù)據(jù)強一致性的場景族檬。
-
《JAVA中寫時復制(Copy-On-Write)Map實現(xiàn)》
- 實現(xiàn)讀寫分離歪赢,讀取發(fā)生在原始數(shù)據(jù)上,寫入發(fā)生在副本上单料。
- 不用加鎖埋凯,通過最終一致實現(xiàn)一致性。
RingBuffer
可重入鎖 & 不可重入鎖
-
- 通過簡單代碼舉例說明可重入鎖和不可重入鎖白对。
- 可重入鎖指同一個線程可以再次獲得之前已經獲得的鎖。
- 可重入鎖可以用戶避免死鎖换怖。
- Java中的可重入鎖:synchronized 和 java.util.concurrent.locks.ReentrantLock
-
《ReenTrantLock可重入鎖(和synchronized的區(qū)別)總結》
- synchronized 使用方便甩恼,編譯器來加鎖,是非公平鎖沉颂。
- ReenTrantLock 使用靈活条摸,鎖的公平性可以定制。
- 相同加鎖場景下兆览,推薦使用 synchronized屈溉。
互斥鎖 & 共享鎖
互斥鎖:同時只能有一個線程獲得鎖塞关。比如抬探,ReentrantLock 是互斥鎖,ReadWriteLock 中的寫鎖是互斥鎖。
共享鎖:可以有多個線程同時或的鎖小压。比如线梗,Semaphore、CountDownLatch 是共享鎖怠益,ReadWriteLock 中的讀鎖是共享鎖仪搔。
死鎖
-
- 互斥、持有蜻牢、不可剝奪烤咧、不可剝奪。
-
- JConsole 可以識別死鎖煮嫌。
-
- jstack 可以顯示死鎖。
操作系統(tǒng)
計算機原理
CPU
多級緩存
典型的 CPU 有三級緩存昌阿,距離核心越近,速度越快恳邀,空間越小懦冰。L1 一般 32k,L2 一般 256k谣沸,L3 一般12M刷钢。內存速度需要200個 CPU 周期,CPU 緩存需要1個CPU周期乳附。
進程
TODO
線程
協(xié)程
-
《終結python協(xié)程----從yield到actor模型的實現(xiàn)》
- 線程的調度是由操作系統(tǒng)負責闯捎,協(xié)程調度是程序自行負責
- 與線程相比,協(xié)程減少了無謂的操作系統(tǒng)切換.
- 實際上當遇到IO操作時做切換才更有意義许溅,(因為IO操作不用占用CPU)瓤鼻,如果沒遇到IO操作,按照時間片切換.
Linux
設計模式
設計模式的六大原則
-
《設計模式的六大原則》
- 開閉原則:對擴展開放,對修改關閉贤重,多使用抽象類和接口茬祷。
- 里氏代換原則:基類可以被子類替換,使用抽象類繼承,不使用具體類繼承并蝗。
- 依賴倒轉原則:要依賴于抽象,不要依賴于具體祭犯,針對接口編程,不針對實現(xiàn)編程。
- 接口隔離原則:使用多個隔離的接口,比使用單個接口好滚停,建立最小的接口沃粗。
- 迪米特法則:一個軟件實體應當盡可能少地與其他實體發(fā)生相互作用,通過中間類建立聯(lián)系键畴。
- 合成復用原則:盡量使用合成/聚合,而不是使用繼承最盅。
23種常見設計模式
應用場景
-
-
結構型模式:
- 適配器:用來把一個接口轉化成另一個接口突雪,如 java.util.Arrays#asList()。
- 橋接模式:這個模式將抽象和抽象操作的實現(xiàn)進行了解耦涡贱,這樣使得抽象和實現(xiàn)可以獨立地變化咏删,如JDBC;
- 組合模式:使得客戶端看來單個對象和對象的組合是同等的问词。換句話說督函,某個類型的方法同時也接受自身類型作為參數(shù)麸澜,如 Map.putAll睦裳,List.addAll洪鸭、Set.addAll堂鲤。
- 裝飾者模式:動態(tài)的給一個對象附加額外的功能凹蜈,這也是子類的一種替代方式遇骑,如 java.util.Collections#checkedList|Map|Set|SortedSet|SortedMap撵枢。
- 享元模式:使用緩存來加速大量小對象的訪問時間捧请,如 valueOf(int)锋喜。
- 代理模式:代理模式是用一個簡單的對象來代替一個復雜的或者創(chuàng)建耗時的對象些己,如 java.lang.reflect.Proxy
-
創(chuàng)建模式:
- 抽象工廠模式:抽象工廠模式提供了一個協(xié)議來生成一系列的相關或者獨立的對象,而不用指定具體對象的類型嘿般,如 java.util.Calendar#getInstance()段标。
- 建造模式(Builder):定義了一個新的類來構建另一個類的實例,以簡化復雜對象的創(chuàng)建炉奴,如:java.lang.StringBuilder#append()逼庞。
- 工廠方法:就是 一個返* 回具體對象的方法,而不是多個瞻赶,如 java.lang.Object#toString()赛糟、java.lang.Class#newInstance()。
- 原型模式:使得類的實例能夠生成自身的拷貝砸逊、如:java.lang.Object#clone()璧南。
- 單例模式:全局只有一個實例,如 java.lang.Runtime#getRuntime()师逸。
-
行為模式:
- 責任鏈模式:通過把請求從一個對象傳遞到鏈條中下一個對象的方式司倚,直到請求被處理完畢,以實現(xiàn)對象間的解耦篓像。如 javax.servlet.Filter#doFilter()动知。
- 命令模式:將操作封裝到對象內,以便存儲员辩,傳遞和返回盒粮,如:java.lang.Runnable。
- 解釋器模式:定義了一個語言的語法奠滑,然后解析相應語法的語句丹皱,如妒穴,java.text.Format,java.text.Normalizer种呐。
- 迭代器模式:提供一個一致的方法來順序訪問集合中的對象,如 java.util.Iterator弃甥。
- 中介者模式:通過使用一個中間對象來進行消息分發(fā)以及減少類之間的直接依賴爽室,java.lang.reflect.Method#invoke()。
- 空對象模式:如 java.util.Collections#emptyList()淆攻。
- 觀察者模式:它使得一個對象可以靈活的將消息發(fā)送給感興趣的對象阔墩,如 java.util.EventListener。
- 模板方法模式:讓子類可以重寫方法的一部分瓶珊,而不是整個重寫啸箫,如 java.util.Collections#sort()。
-
單例模式
責任鏈模式
TODO
MVC
-
《MVC 模式》
- 模型(model)-視圖(view)-控制器(controller)
IOC
- 《理解 IOC》
-
《IOC 的理解與解釋》
- 正向控制:傳統(tǒng)通過new的方式忘苛。反向控制,通過容器注入對象唱较。
- 作用:用于模塊解耦扎唾。
- DI:Dependency Injection,即依賴注入南缓,只關心資源使用胸遇,不關心資源來源。
AOP
- 《輕松理解AOP(面向切面編程)》
- 《Spring AOP詳解》
-
《Spring AOP的實現(xiàn)原理》
- Spring AOP使用的動態(tài)代理汉形,主要有兩種方式:JDK動態(tài)代理和CGLIB動態(tài)代理纸镊。
-
《Spring AOP 實現(xiàn)原理與 CGLIB 應用》
- Spring AOP 框架對 AOP 代理類的處理原則是:如果目標對象的實現(xiàn)類實現(xiàn)了接口,Spring AOP 將會采用 JDK 動態(tài)代理來生成 AOP 代理類概疆;如果目標對象的實現(xiàn)類沒有實現(xiàn)接口逗威,Spring AOP 將會采用 CGLIB 來生成 AOP 代理類
UML
微服務思想
康威定律
-
- 定律一:組織溝通方式會通過系統(tǒng)設計表達出來,就是說架構的布局和組織結構會有相似岔冀。
- 定律二:時間再多一件事情也不可能做的完美庵楷,但總有時間做完一件事情。一口氣吃不成胖子楣颠,先搞定能搞定的尽纽。
- 定律三:線型系統(tǒng)和線型組織架構間有潛在的異質同態(tài)特性。種瓜得瓜童漩,做獨立自治的子系統(tǒng)減少溝通成本弄贿。
- 定律四:大的系統(tǒng)組織總是比小系統(tǒng)更傾向于分解。合久必分矫膨,分而治之差凹。
運維 & 統(tǒng)計 & 技術支持
常規(guī)監(jiān)控
-
《騰訊業(yè)務系統(tǒng)監(jiān)控的修煉之路》
- 監(jiān)控的方式:主動期奔、被動、旁路(比如輿情監(jiān)控)
- 監(jiān)控類型: 基礎監(jiān)控危尿、服務端監(jiān)控呐萌、客戶端監(jiān)控、
監(jiān)控谊娇、用戶端監(jiān)控 - 監(jiān)控的目標:全肺孤、塊、準
- 核心指標:請求量济欢、成功率赠堵、耗時
-
- Zabbix法褥、Nagios茫叭、Ganglia、Zenoss半等、Open-falcon揍愁、監(jiān)控寶、 360網站服務監(jiān)控杀饵、阿里云監(jiān)控吗垮、百度云觀測、小蜜蜂網站監(jiān)測等凹髓。
命令行監(jiān)控工具
-
- top烁登、sar、tsar蔚舀、nload
《JVM性能調優(yōu)監(jiān)控工具jps饵沧、jstack、jmap赌躺、jhat狼牺、jstat、hprof使用詳解》
APM
APM — Application Performance Management
-
主要開源軟件,按字母排序
-
- 主要基于 Google的Dapper(大規(guī)模分布式系統(tǒng)的跟蹤系統(tǒng)) 思想缅叠。
統(tǒng)計分析
-
- 常用指標:訪問與訪客悄泥、停留時長、跳出率肤粱、退出率弹囚、轉化率、參與度
-
《APP埋點常用的統(tǒng)計工具领曼、埋點目標和埋點內容》
- 第三方統(tǒng)計:友盟鸥鹉、百度移動蛮穿、魔方、App Annie毁渗、talking data践磅、神策數(shù)據(jù)等。
-
- 所謂無痕灸异、即通過可視化工具配置采集節(jié)點府适,在前端自動解析配置并上報埋點數(shù)據(jù),而非硬編碼绎狭。
持續(xù)集成(CI/CD)
Jenkins
環(huán)境分離
開發(fā)褥傍、測試儡嘶、生成環(huán)境分離。
自動化運維
Ansible
puppet
chef
測試
TDD 理論
-
《深度解讀 - TDD(測試驅動開發(fā))》
- 基于測試用例編碼功能代碼,XP(Extreme Programming)的核心實踐.
- 好處:一次關注一個點朋贬,降低思維負擔凯楔;迎接需求變化或改善代碼的設計;提前澄清需求锦募;快速反饋摆屯;
單元測試
- 《Java單元測試之JUnit篇》
-
《JUnit 4 與 TestNG 對比》
- TestNG 覆蓋 JUnit 功能,適用于更復雜的場景糠亩。
-
《單元測試主要的測試功能點》
- 模塊接口測試虐骑、局部數(shù)據(jù)結構測試、路徑測試 赎线、錯誤處理測試廷没、邊界條件測試 。
壓力測試
- 《Apache ab 測試使用指南》
- 《大型網站壓力測試及優(yōu)化方案》
- 《10大主流壓力/負載/性能測試工具推薦》
- 《真實流量壓測工具 tcpcopy應用淺析》
- 《nGrinder 簡易使用教程》
全鏈路壓測
A/B 、灰度滞项、藍綠測試
虛擬化
KVM
Xen
OpenVZ
容器技術
Docker
云技術
OpenStack
DevOps
文檔管理
- Confluence-收費文檔管理系統(tǒng)
- GitLab?
- Wiki
中間件
Web Server
Nginx
-
- Nginx 通過異步非阻塞的事件處理機制實現(xiàn)高并發(fā)潭流。Apache 每個請求獨占一個線程竞惋,非常消耗系統(tǒng)資源。
- 事件驅動適合于IO密集型服務(Nginx)灰嫉,多進程或線程適合于CPU密集型服務(Apache)拆宛,所以Nginx適合做反向代理,而非web服務器使用讼撒。
-
- nginx只適合靜態(tài)和反向代理浑厚,不適合處理動態(tài)請求。
OpenResty
- 官方網站
-
《淺談 OpenResty》
- 通過 Lua 模塊可以在Nginx上進行開發(fā)根盒。
Apache Httpd
Tomcat
架構原理
-
《JBoss vs. Tomcat: Choosing A Java Application Server》
- Tomcat 是輕量級的 Serverlet 容器钳幅,沒有實現(xiàn)全部 JEE 特性(比如持久化和事務處理),但可以通過其他組件代替炎滞,比如Srping敢艰。
- Jboss 實現(xiàn)全部了JEE特性,軟件開源免費册赛、文檔收費钠导。
調優(yōu)方案
-
- 啟動NIO模式(或者APR);調整線程池森瘪;禁用AJP連接器(Nginx+tomcat的架構牡属,不需要AJP);
-
- AJP 協(xié)議(8009端口)用于降低和前端Server(如Apache扼睬,而且需要支持AJP協(xié)議)的連接數(shù)(前端)逮栅,通過長連接提高性能。
- 并發(fā)高時窗宇,AJP協(xié)議優(yōu)于HTTP協(xié)議措伐。
Jetty
- 《Jetty 的工作原理以及與 Tomcat 的比較》
-
《jetty和tomcat優(yōu)勢比較》
- 架構比較:Jetty的架構比Tomcat的更為簡單。
- 性能比較:Jetty和Tomcat性能方面差異不大担映,Jetty默認采用NIO結束在處理I/O請求上更占優(yōu)勢废士,Tomcat默認采用BIO處理I/O請求,Tomcat適合處理少數(shù)非常繁忙的鏈接蝇完,處理靜態(tài)資源時性能較差官硝。
- 其他方面:Jetty的應用更加快速,修改簡單短蜕,對新的Servlet規(guī)范的支持較好;Tomcat 對JEE和Servlet 支持更加全面氢架。
緩存
本地緩存
-
- 堆內岖研、堆外、磁盤三級緩存。
- 可按照緩存空間容量進行設置孙援。
- 按照時間害淤、次數(shù)等過期策略。
-
- 簡單輕量拓售、無堆外窥摄、磁盤緩存。
客戶端緩存
-
- 主要是利用 Cache-Control 參數(shù)崭放。
服務端緩存
Memcached
-
- 采用多路復用技術提高并發(fā)性。
- slab分配算法: memcached給Slab分配內存空間鸽凶,默認是1MB币砂。分配給Slab之后 把slab的切分成大小相同的chunk,Chunk是用于緩存記錄的內存空間玻侥,Chunk 的大小默認按照1.25倍的速度遞增决摧。好處是不會頻繁申請內存,提高IO效率使碾,壞處是會有一定的內存浪費蜜徽。
-
《memcache 中 add 、 set 灰蛙、replace 的區(qū)別》
- 區(qū)別在于當key存在還是不存在時祟剔,返回值是true和false的。
Redis
-
- 使用 ziplist 存儲鏈表摩梧,ziplist是一種壓縮鏈表物延,它的好處是更能節(jié)省內存空間,因為它所存儲的內容都是在連續(xù)的內存區(qū)域當中的仅父。
- 使用 skiplist(跳躍表)來存儲有序集合對象叛薯、查找上先從高Level查起、時間復雜度和紅黑樹相當笙纤,實現(xiàn)容易耗溜,無鎖、并發(fā)性好省容。
-
- RDB方式:定期備份快照抖拴,常用于災難恢復。優(yōu)點:通過fork出的進程進行備份腥椒,不影響主進程阿宅、RDB 在恢復大數(shù)據(jù)集時的速度比 AOF 的恢復速度要快候衍。缺點:會丟數(shù)據(jù)。
- AOF方式:保存操作日志方式洒放。優(yōu)點:恢復時數(shù)據(jù)丟失少脱柱,缺點:文件大,回復慢拉馋。
- 也可以兩者結合使用榨为。
架構
回收策略
Tair
- 官方網站
- 《Tair和Redis的對比》
- 特點:可以配置備份節(jié)點數(shù)目,通過異步同步到備份節(jié)點
- 一致性Hash算法煌茴。
- 架構:和Hadoop 的設計思想類似随闺,有Configserver,DataServer蔓腐,Configserver 通過心跳來檢測矩乐,Configserver也有主備關系。
幾種存儲引擎:
- MDB回论,完全內存性散罕,可以用來存儲Session等數(shù)據(jù)。
- Rdb(類似于Redis)傀蓉,輕量化欧漱,去除了aof之類的操作,支持Restfull操作
- LDB(LevelDB存儲引擎)葬燎,持久化存儲误甚,LDB 作為rdb的持久化,google實現(xiàn)谱净,比較高效窑邦,理論基礎是LSM(Log-Structured-Merge Tree)算法,現(xiàn)在內存中修改數(shù)據(jù)壕探,達到一定量時(和內存匯總的舊數(shù)據(jù)一同寫入磁盤)再寫入磁盤冈钦,存儲更加高效,縣比喻Hash算法李请。
- Tair采用共享內存來存儲數(shù)據(jù)瞧筛,如果服務掛掉(非服務器),重啟服務之后捻艳,數(shù)據(jù)亦然還在驾窟。
消息隊列
-
《消息隊列-推/拉模式學習 & ActiveMQ及JMS學習》
- RabbitMQ 消費者默認是推模式(也支持拉模式)。
- Kafka 默認是拉模式认轨。
- Push方式:優(yōu)點是可以盡可能快地將消息發(fā)送給消費者绅络,缺點是如果消費者處理能力跟不上,消費者的緩沖區(qū)可能會溢出。
- Pull方式:優(yōu)點是消費端可以按處理能力進行拉去恩急,缺點是會增加消息延遲杉畜。
消息總線
消息總線相當于在消息隊列之上做了一層封裝此叠,統(tǒng)一入口,統(tǒng)一管控随珠、簡化接入成本灭袁。
消息的順序
RabbitMQ
支持事務,推拉模式都是支持窗看、適合需要可靠性消息傳輸?shù)膱鼍啊?/p>
RocketMQ
Java實現(xiàn)茸歧,推拉模式都是支持,吞吐量遜于Kafka显沈∪硐梗可以保證消息順序。
ActiveMQ
純Java實現(xiàn)拉讯,兼容JMS涤浇,可以內嵌于Java應用中。
Kafka
高吞吐量魔慷、采用拉模式只锭。適合高IO場景,比如日志同步盖彭。
Redis 消息推送
生產者竟痰、消費者模式完全是客戶端行為戚绕,list 和 拉模式實現(xiàn)绑嘹,阻塞等待采用 blpop 指令戴甩。
ZeroMQ
TODO
定時調度
單機定時調度
-
- fork 進程 + sleep 輪詢
-
- 定時調度在 QuartzSchedulerThread 代碼中愚墓,while()無限循環(huán)酪惭,每次循環(huán)取出時間將到的trigger氯哮,觸發(fā)對應的job沪饺,直到調度器線程被關閉躏敢。
分布式定時調度
-
《這些優(yōu)秀的國產分布式任務調度系統(tǒng),你用過幾個整葡?》
- opencron件余、LTS、XXL-JOB、Elastic-Job啼器、Uncode-Schedule旬渠、Antares
-
- Quartz集群中,獨立的Quartz節(jié)點并不與另一其的節(jié)點或是管理節(jié)點通信端壳,而是通過相同的數(shù)據(jù)庫表來感知到另一Quartz應用的
RPC
-
《從零開始實現(xiàn)RPC框架 - RPC原理及實現(xiàn)》
- 核心角色:Server: 暴露服務的服務提供方告丢、Client: 調用遠程服務的服務消費方、Registry: 服務注冊與發(fā)現(xiàn)的注冊中心损谦。
Dubbo
** SPI **
TODO
Thrift
- 官方網站
-
《Thrift RPC詳解》
- 支持多語言,通過中間語言定義接口麻敌。
gRPC
服務端可以認證加密栅炒,在外網環(huán)境下,可以保證數(shù)據(jù)安全术羔。
數(shù)據(jù)庫中間件
Sharding Jdbc
日志系統(tǒng)
日志搜集
配置中心
-
- Spring Boot 和 Spring Cloud
- 支持推赢赊、拉模式更新配置
- 支持多種語言
servlet 3.0 異步特性可用于配置中心的客戶端
API 網關
主要職責:請求轉發(fā)、安全認證级历、協(xié)議轉換释移、容災。
網絡
協(xié)議
OSI 七層協(xié)議
TCP/IP
HTTP
HTTP2.0
- 《HTTP 2.0 原理詳細分析》
-
《HTTP2.0的基本單位為二進制幀》
- 利用二進制幀負責傳輸。
- 多路復用嚼贡。
HTTPS
-
- 使用非對稱加密協(xié)商加密算法
- 使用對稱加密方式傳輸數(shù)據(jù)
- 使用第三方機構簽發(fā)的證書熏纯,來加密公鑰,用于公鑰的安全傳輸粤策、防止被中間人串改樟澜。
網絡模型
-
《web優(yōu)化必須了解的原理之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之間的區(qū)別總結》
- select桩匪,poll打瘪,epoll本質上都是同步I/O,因為他們都需要在讀寫事件就緒后自己負責進行讀寫傻昙,也就是說這個讀寫過程是阻塞的闺骚。
- select 有打開文件描述符數(shù)量限制,默認1024(2048 for x64)妆档,100萬并發(fā)僻爽,就要用1000個進程、切換開銷大贾惦;poll采用鏈表結構胸梆,沒有數(shù)量限制。
- select须板,poll “醒著”的時候要遍歷整個fd集合碰镜,而epoll在“醒著”的時候只要判斷一下就緒鏈表是否為空就行了,通過回調機制節(jié)省大量CPU時間习瑰;select绪颖,poll每次調用都要把fd集合從用戶態(tài)往內核態(tài)拷貝一次,而epoll只要一次拷貝甜奄。
- poll會隨著并發(fā)增加柠横,性能逐漸下降,epoll采用紅黑樹結構课兄,性能穩(wěn)定牍氛,不會隨著連接數(shù)增加而降低。
-
- 在連接數(shù)少并且連接都十分活躍的情況下,select和poll的性能可能比epoll好曲饱,畢竟epoll的通知機制需要很多函數(shù)回調。
-
- NIO 是一種同步非阻塞的 IO 模型珠月。同步是指線程不斷輪詢 IO 事件是否就緒扩淀,非阻塞是指線程在等待 IO 的時候,可以同時做其他任務
Epoll
Java NIO
kqueue
連接和短連接
框架
-
《Netty原理剖析》
- Reactor 模式介紹驻谆。
- Netty 是 Reactor 模式的一種實現(xiàn)卵凑。
零拷貝(Zero-copy)
-
《對于 Netty ByteBuf 的零拷貝(Zero Copy) 的理解》
- 多個物理分離的buffer,通過邏輯上合并成為一個胜臊,從而避免了數(shù)據(jù)在內存之間的拷貝勺卢。
序列化(二進制協(xié)議)
Hessian
-
《Hessian原理分析》
Binary-RPC;不僅僅是序列化
Protobuf
《Protobuf協(xié)議的Java應用例子》
Goolge出品、占用空間和效率完勝其他序列化類庫象对,如Hessian黑忱;需要編寫 .proto 文件。-
《Protocol Buffers序列化協(xié)議及應用》
- 關于協(xié)議的解釋勒魔;缺點:可讀性差;
-
- protostuff 的好處是不用寫 .proto 文件甫煞,Java 對象直接就可以序列化。
數(shù)據(jù)庫
基礎理論
數(shù)據(jù)庫設計的三大范式
-
《數(shù)據(jù)庫的三大范式以及五大約束》
- 第一范式:數(shù)據(jù)表中的每一列(每個字段)必須是不可拆分的最小單元冠绢,也就是確保每一列的原子性抚吠;
- 第二范式(2NF):滿足1NF后,要求表中的所有列弟胀,都必須依賴于主鍵楷力,而不能有任何一列與主鍵沒有關系,也就是說一個表只描述一件事情孵户;
- 第三范式:必須先滿足第二范式(2NF)弥雹,要求:表中的每一列只與主鍵直接相關而不是間接相關,(表中的每一列只能依賴于主鍵)延届;
MySQL
原理
-
《MySQL存儲引擎--MyISAM與InnoDB區(qū)別》
- 兩種類型最主要的差別就是Innodb 支持事務處理與外鍵和行級鎖
InnoDB
優(yōu)化
-
- 原則上就是縮小掃描范圍剪勿。
索引
聚集索引, 非聚集索引
MyISAM 是非聚集,InnoDB 是聚集
復合索引
自適應哈希索引(AHI)
explain
NoSQL
MongoDB
- MongoDB 教程
-
《Mongodb相對于關系型數(shù)據(jù)庫的優(yōu)缺點》
- 優(yōu)點:弱一致性(最終一致)方庭,更能保證用戶的訪問速度厕吉;內置GridFS,支持大容量的存儲械念;Schema-less 數(shù)據(jù)庫头朱,不用預先定義結構;內置Sharding龄减;相比于其他NoSQL项钮,第三方支持豐富;性能優(yōu)越希停;
- 缺點:mongodb不支持事務操作烁巫;mongodb占用空間過大;MongoDB沒有如MySQL那樣成熟的維護工具宠能,這對于開發(fā)和IT運營都是個值得注意的地方亚隙;
Hbase
-
《Hbase與傳統(tǒng)數(shù)據(jù)庫的區(qū)別》
- 空數(shù)據(jù)不存儲,節(jié)省空間违崇,且適用于并發(fā)阿弃。
-
- rowkey 按照字典順序排列诊霹,便于批量掃描。
- 通過散列可以避免熱點渣淳。
搜索引擎
搜索引擎原理
Lucene
Elasticsearch
Solr
sphinx
性能
性能優(yōu)化方法論
-
《15天的性能優(yōu)化工作入愧,5方面的調優(yōu)經驗》
- 代碼層面鄙漏、業(yè)務層面、數(shù)據(jù)庫層面砂客、服務器層面泥张、前端優(yōu)化。
容量評估
- 《聯(lián)網性能與容量評估的方法論和典型案例》
-
《互聯(lián)網架構鞠值,如何進行容量設計媚创?》
- 評估總訪問量、評估平均訪問量QPS彤恶、評估高峰QPS钞钙、評估系統(tǒng)、單機極限QPS
CDN 網絡
連接池
性能調優(yōu)
大數(shù)據(jù)
流式計算
Storm
Flink
Kafka Stream
應用場景
例如:
- 廣告相關實時統(tǒng)計;
- 推薦系統(tǒng)用戶畫像標簽實時更新术徊;
- 線上服務健康狀況實時監(jiān)測本刽;
- 實時榜單糙捺;
- 實時數(shù)據(jù)統(tǒng)計妇萄。
Hadoop
HDFS
MapReduce
Yarn
Spark
安全
web 安全
XSS
CSRF
SQL 注入
Hash Dos
-
《邪惡的JAVA HASH DOS攻擊》
- 利用JsonObjet 上傳大Json,JsonObject 底層使用HashMap辜羊;不同的數(shù)據(jù)產生相同的hash值笋除,使得構建Hash速度變慢斜友,耗盡CPU。
- 《一種高級的DoS攻擊-Hash碰撞攻擊》
- 《關于Hash Collision DoS漏洞:解析與解決方案》
腳本注入
漏洞掃描工具
驗證碼
-
- 滑動驗證碼是根據(jù)人在滑動滑塊的響應時間垃它,拖拽速度鲜屏,時間,位置国拇,軌跡洛史,重試次數(shù)等來評估風險。
DDoS 防范
用戶隱私信息保護
- 用戶密碼非明文保存贝奇,加動態(tài)slat虹菲。
- 身份證號,手機號如果要顯示掉瞳,用 “*” 替代部分字符毕源。
- 聯(lián)系方式在的顯示與否由用戶自己控制。
- 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 僅能用于數(shù)字簽名厂僧,不能進行數(shù)據(jù)加密解密扣草,其安全性和RSA相當,但其性能要比RSA快颜屠。
-
256位的ECC秘鑰的安全性等同于3072位的RSA秘鑰辰妙。
服務器安全
數(shù)據(jù)安全
數(shù)據(jù)備份
TODO
網絡隔離
內外網分離
TODO
登錄跳板機
在內外環(huán)境中通過跳板機登錄到線上主機。
授權汽纤、認證
RBAC
OAuth2.0
雙因素認證(2FA)
2FA - Two-factor authentication上岗,用于加強登錄驗證
常用做法是 登錄密碼 + 手機驗證碼(或者令牌Key,類似于與網銀的 USB key)
- 【《雙因素認證(2FA)教程》】(http://www.ruanyifeng.com/blog/2017/11/2fa-tutorial.html)
單點登錄(SSO)
常用開源框架
開源協(xié)議
日志框架
Log4j蕴坪、Log4j2
- 《log4j 詳細講解》
- 《log4j2 實際使用詳解》
-
《Log4j1,Logback以及Log4j2性能測試對比》
- Log4J 異步日志性能優(yōu)異肴掷。
Logback
ORM
-
《ORM框架使用優(yōu)缺點》
- 主要目的是為了提高開發(fā)效率背传。
MyBatis:
-
- 一級緩存是SqlSession級別的緩存呆瞻,緩存的數(shù)據(jù)只在SqlSession內有效
- 二級緩存是mapper級別的緩存,同一個namespace公用這一個緩存径玖,所以對SqlSession是共享的痴脾;使用 LRU 機制清理緩存,通過 cacheEnabled 參數(shù)開啟梳星。
網絡框架
TODO
Web 框架
Spring 家族
Spring
Spring Boot
Spring Cloud
工具框架
分布式設計
擴展性設計
-
- 總結下來赞赖,通用的套路就是分布滚朵、緩存及異步處理。
-
- 水平切分+垂直切分
- 利用中間件進行分片如前域,MySQL Proxy辕近。
- 利用分片策略進行切分,如按照ID取模匿垄。
-
- 分布式服務+消息隊列移宅。
穩(wěn)定性 & 高可用
-
《系統(tǒng)設計:關于高可用系統(tǒng)的一些技術方案》
- 可擴展:水平擴展、垂直擴展椿疗。 通過冗余部署漏峰,避免單點故障。
- 隔離:避免單一業(yè)務占用全部資源届榄。避免業(yè)務之間的相互影響 2. 機房隔離避免單點故障浅乔。
- 解耦:降低維護成本,降低耦合風險痒蓬。減少依賴童擎,減少相互間的影響。
- 限流:滑動窗口計數(shù)法攻晒、漏桶算法顾复、令牌桶算法等算法。遇到突發(fā)流量時鲁捏,保證系統(tǒng)穩(wěn)定芯砸。
- 降級:緊急情況下釋放非核心功能的資源。犧牲非核心業(yè)務给梅,保證核心業(yè)務的高可用假丧。
- 熔斷:異常情況超出閾值進入熔斷狀態(tài),快速失敗动羽。減少不穩(wěn)定的外部依賴對核心服務的影響包帚。
- 自動化測試:通過完善的測試,減少發(fā)布引起的故障运吓。
- 灰度發(fā)布:灰度發(fā)布是速度與安全性作為妥協(xié)渴邦,能夠有效減少發(fā)布故障。
-
《關于高可用的系統(tǒng)》
- 設計原則:數(shù)據(jù)不丟(持久化)拘哨;服務高可用(服務副本)谋梭;絕對的100%高可用很難,目標是做到盡可能多的9倦青,如99.999%(全年累計只有5分鐘)瓮床。
硬件負載均衡
-
《轉!!負載均衡器技術Nginx和F5的優(yōu)缺點對比》
- 主要是和F5對比隘庄。
軟件負載均衡
《幾種負載均衡算法》
輪尋、權重峭沦、負載贾虽、最少連接逃糟、QoS-
- 配置簡單吼鱼,更新速度慢。
-
- 簡單輕量绰咽、學習成本低菇肃;主要適用于web應用。
-
《借助LVS+Keepalived實現(xiàn)負載均衡 》
- 配置比較負載取募、只支持到4層琐谤,性能較高。
-
- 支持到七層(比如HTTP)玩敏、功能比較全面斗忌,性能也不錯。
-
《Haproxy+Keepalived+MySQL實現(xiàn)讀均衡負載》
- 主要是用戶讀請求的負載均衡旺聚。
限流
-
《談談高并發(fā)系統(tǒng)的限流》
- 計數(shù)器:通過滑動窗口計數(shù)器织阳,控制單位時間內的請求次數(shù),簡單粗暴砰粹。
- 漏桶算法:固定容量的漏桶唧躲,漏桶滿了就丟棄請求,比較常用碱璃。
- 令牌桶算法:固定容量的令牌桶弄痹,按照一定速率添加令牌,處理請求前需要拿到令牌嵌器,拿不到令牌則丟棄請求肛真,或進入丟隊列,可以通過控制添加令牌的速率爽航,來控制整體速度蚓让。Guava 中的 RateLimiter 是令牌桶的實現(xiàn)。
- Nginx 限流:通過
limit_req
等模塊限制并發(fā)連接數(shù)岳掐。
應用層容災
-
- 雪崩效應原因:硬件故障凭疮、硬件故障、程序Bug串述、重試加大流量执解、用戶大量請求。
- 雪崩的對策:限流、改進緩存模式(緩存預加載衰腌、同步調用改異步)新蟆、自動擴容、降級右蕊。
- Hystrix設計原則:
- 資源隔離:Hystrix通過將每個依賴服務分配獨立的線程池進行資源隔離, 從而避免服務雪崩琼稻。
- 熔斷開關:服務的健康狀況 = 請求失敗數(shù) / 請求總數(shù),通過閾值設定和滑動窗口控制開關饶囚。
- 命令模式:通過繼承 HystrixCommand 來包裝服務調用邏輯帕翻。
-
- 主要策略:失效瞬間:單機使用鎖;使用分布式鎖规惰;不過期睬塌;
- 熱點數(shù)據(jù):熱點數(shù)據(jù)單獨存儲;使用本地緩存歇万;分成多個子key揩晴;
跨機房容災
-
- 通過自研中間件進行數(shù)據(jù)同步。
-
- 注意延遲問題贪磺,多次跨機房調用會將延時放大數(shù)倍硫兰。
- 建房間專線很大概率會出現(xiàn)問題,做好運維和程序層面的容錯缘挽。
- 不能依賴于程序端數(shù)據(jù)雙寫瞄崇,要有自動同步方案。
- 數(shù)據(jù)永不在高延遲和較差網絡質量下壕曼,考慮同步質量問題苏研。
- 核心業(yè)務和次要業(yè)務分而治之,甚至只考慮核心業(yè)務。
- 異地多活監(jiān)控部署、測試也要跟上舀透。
- 業(yè)務允許的情況下考慮用戶分區(qū),尤其是游戲衅鹿、郵箱業(yè)務。
- 控制跨機房消息體大小过咬,越小越好大渤。
- 考慮使用docker容器虛擬化技術,提高動態(tài)調度能力掸绞。
容災演練流程
-
《依賴治理泵三、灰度發(fā)布、故障演練,阿里電商故障演練系統(tǒng)的設計與實戰(zhàn)經驗》
- 常見故障畫像
- 案例:預案有效性烫幕、預案有效性俺抽、故障復現(xiàn)、架構容災測試较曼、參數(shù)調優(yōu)磷斧、參數(shù)調優(yōu)、故障突襲捷犹、聯(lián)合演練弛饭。
平滑啟動
平滑重啟應用思路
1.端流量(如vip層)、2. flush 數(shù)據(jù)(如果有)伏恐、3, 重啟應用《JVM安全退出(如何優(yōu)雅的關閉java服務)》
推薦推出方式:System.exit孩哑,Kill SIGTERM;不推薦 kill-9翠桦;用 Runtime.addShutdownHook 注冊鉤子。《常見Java應用如何優(yōu)雅關閉》
Java胳蛮、Srping销凑、Dubbo 優(yōu)雅關閉方式。
數(shù)據(jù)庫擴展
讀寫分離模式
-
《DRBD+Heartbeat+Mysql高可用讀寫分離架構》
- DRDB 進行磁盤復制仅炊,避免單點問題斗幼。
分片模式
-
- 中間件: 輕量級:sharding-jdbc、TSharding抚垄;重量級:Atlas蜕窿、MyCAT、Vitess等呆馁。
- 問題:事務桐经、Join、遷移浙滤、擴容阴挣、ID、分頁等纺腊。
- 事務補償:對數(shù)據(jù)進行對帳檢查;基于日志進行比對;定期同標準數(shù)據(jù)來源進行同步等畔咧。
- 分庫策略:數(shù)值范圍;取模揖膜;日期等誓沸。
- 分庫數(shù)量:通常 MySQL 單庫 5千萬條、Oracle 單庫一億條需要分庫壹粟。
-
- 分區(qū):是MySQL內部機制拜隧,對客戶端透明,數(shù)據(jù)存儲在不同文件中,表面上看是同一個表虹蓄。
- 分表:物理上創(chuàng)建不同的表犀呼、客戶端需要管理分表路由。
服務治理
服務注冊與發(fā)現(xiàn)
-
《永不失聯(lián)薇组!如何實現(xiàn)微服務架構中的服務發(fā)現(xiàn)外臂?》
- 客戶端服務發(fā)現(xiàn)模式:客戶端直接查詢注冊表,同時自己負責負載均衡律胀。Eureka 采用這種方式宋光。
- 服務器端服務發(fā)現(xiàn)模式:客戶端通過負載均衡查詢服務實例。
-
《SpringCloud服務注冊中心比較:Consul vs Zookeeper vs Etcd vs Eureka》
- CAP支持:Consul(CA)炭菌、zookeeper(cp)罪佳、etcd(cp) 、euerka(ap)
- 作者認為目前 Consul 對 Spring cloud 的支持比較好黑低。
-
《基于Zookeeper的服務注冊與發(fā)現(xiàn)》
- 優(yōu)點:API簡單赘艳、Pinterest,Airbnb 在用克握、多語言蕾管、通過watcher機制來實現(xiàn)配置PUSH,能快速響應配置變化菩暗。
服務路由控制
-
《分布式服務框架學習筆記4 服務路由》
- 原則:透明化路由
- 負載均衡策略:隨機掰曾、輪詢、服務調用延遲停团、一致性哈希旷坦、粘滯連接
- 本地路由有限策略:injvm(優(yōu)先調用jvm內部的服務),innative(優(yōu)先使用相同物理機的服務),原則上找距離最近的服務佑稠。
- 配置方式:統(tǒng)一注冊表秒梅;本地配置;動態(tài)下發(fā)讶坯。
分布式一致
CAP 與 BASE 理論
-
《從分布式一致性談到CAP理論番电、BASE理論》
- 一致性分類:強一致(立即一致);弱一致(可在單位時間內實現(xiàn)一致辆琅,比如秒級)漱办;最終一致(弱一致的一種,一定時間內最終一致)
- CAP:一致性婉烟、可用性娩井、分區(qū)容錯性(網絡故障引起)
- BASE:Basically Available(基本可用)、Soft state(軟狀態(tài))和Eventually consistent(最終一致性)
- BASE理論的核心思想是:即使無法做到強一致性似袁,但每個應用都可以根據(jù)自身業(yè)務特點洞辣,采用適當?shù)姆绞絹硎瓜到y(tǒng)達到最終一致性咐刨。
分布式鎖
-
- 基于數(shù)據(jù)庫的分布式鎖:優(yōu)點:操作簡單、容易理解扬霜。缺點:存在單點問題定鸟、數(shù)據(jù)庫性能夠開銷較大、不可重入著瓶;
- 基于緩存的分布式鎖:優(yōu)點:非阻塞联予、性能好。缺點:操作不好容易造成鎖無法釋放的情況材原。
- Zookeeper 分布式鎖:通過有序臨時節(jié)點實現(xiàn)鎖機制沸久,自己對應的節(jié)點需要最小,則被認為是獲得了鎖余蟹。優(yōu)點:集群可以透明解決單點問題卷胯,避免鎖不被釋放問題,同時鎖可以重入威酒。缺點:性能不如緩存方式窑睁,吞吐量會隨著zk集群規(guī)模變大而下降。
-
- 清楚的原理描述 + Java 代碼示例兼搏。
-
- 基于 setnx(set if ont exists)卵慰,有則返回false,否則返回true佛呻。并支持過期時間。
-
- 利用 memcached 的 add(有別于set)操作病线,當key存在時吓著,返回false。
分布式一致性算法
PAXOS
Zab
Raft
-
《Raft 為什么是更易理解的分布式一致性算法》
- 三種角色:Leader(領袖)送挑、Follower(群眾)绑莺、Candidate(候選人)
- 通過隨機等待的方式發(fā)出投票,得票多的獲勝惕耕。
Gossip
兩階段提交纺裁、多階段提交
冪等
-
《分布式系統(tǒng)---冪等性設計》
- 冪等特性的作用:該資源具備冪等性欺缘,請求方無需擔心重復調用會產生錯誤。
- 常見保證冪等的手段:MVCC(類似于樂觀鎖)挤安、去重表(唯一索引)谚殊、悲觀鎖、一次性token蛤铜、序列號方式嫩絮。
分布式一致方案
分布式 Leader 節(jié)點選舉
TCC(Try/Confirm/Cancel) 柔性事務
-
《傳統(tǒng)事務與柔性事務》
- 基于BASE理論:基本可用丛肢、柔性狀態(tài)、最終一致剿干。
- 解決方案:記錄日志+補償(正向補充或者回滾)蜂怎、消息重試(要求程序要冪等);“無鎖設計”置尔、采用樂觀鎖機制杠步。
分布式文件系統(tǒng)
- 說說分布式文件存儲系統(tǒng)-基本架構 ?
-
《各種分布式文件系統(tǒng)的比較》 撰洗?
- HDFS:大批量數(shù)據(jù)讀寫篮愉,用于高吞吐量的場景,不適合小文件差导。
- FastDFS:輕量級试躏、適合小文件。
唯一ID 生成
全局唯一ID
-
《高并發(fā)分布式系統(tǒng)中生成全局唯一Id匯總》
- Twitter 方案(Snowflake 算法):41位時間戳+10位機器標識(比如IP设褐,服務器名稱等)+12位序列號(本地計數(shù)器)
- Flicker 方案:MySQL自增ID + "REPLACE INTO XXX:SELECT LAST_INSERT_ID();"
- UUID:缺點颠蕴,無序,字符串過長助析,占用空間犀被,影響檢索性能。
- MongoDB 方案:利用 ObjectId外冀。缺點:不能自增寡键。
-
- 在數(shù)據(jù)庫中創(chuàng)建 sequence 表,用于記錄雪隧,當前已被占用的id最大值西轩。
- 每臺客戶端主機取一個id區(qū)間(比如 1000~2000)緩存在本地,并更新 sequence 表中的id最大值記錄脑沿。
- 客戶端主機之間取不同的id區(qū)間藕畔,用完再取,使用樂觀鎖機制控制并發(fā)庄拇。
一致性Hash算法
設計思想 & 開發(fā)模式
DDD(Domain-driven Design - 領域驅動設計)
-
- 概念:DDD 主要對傳統(tǒng)軟件開發(fā)流程(分析-設計-編碼)中各階段的割裂問題而提出注服,避免由于一開始分析不明或在軟件開發(fā)過程中的信息流轉不一致而造成軟件無法交付(和需求方設想不一致)的問題。DDD 強調一切以領域(Domain)為中心措近,強調領域專家(Domain Expert)的作用溶弟,強調先定義好領域模型之后在進行開發(fā),并且領域模型可以指導開發(fā)(所謂的驅動)熄诡。
- 過程:理解領域可很、拆分領域、細化領域凰浮,模型的準確性取決于模型的理解深度我抠。
- 設計:DDD 中提出了建模工具实撒,比如聚合怪瓶、實體、值對象、工廠僵井、倉儲维费、領域服務蝶缀、領域事件來幫助領域建模扩借。
-
- 領域(Doamin)本質上就是問題域,比如一個電商系統(tǒng)贱鄙,一個論壇系統(tǒng)等劝贸。
- 界限上下文(Bounded Context):闡述子域之間的關系,可以簡單理解成一個子系統(tǒng)或組件模塊逗宁。
- 領域模型(Domain Model):DDD的核心是建立(用通用描述語言映九、工具—領域通用語言)正確的領域模型;反應業(yè)務需求的本質瞎颗,包括實體和過程件甥;其貫穿軟件分析、設計哼拔、開發(fā) 的整個過程引有;常用表達領域模型的方式:圖、代碼或文字倦逐;
- 領域通用語言:領域專家譬正、開發(fā)設計人員都能立即的語言或工具。
- 經典分層架構:用戶界面/展示層檬姥、應用層导帝、領域層、基礎設施層穿铆,是四層架構模式。
- 使用的模式:
- 關聯(lián)盡量少斋荞,盡量單項荞雏,盡量降低整體復雜度。
- 實體(Entity):領域中的唯一標示平酿,一個實體的屬性盡量少凤优,少則清晰。
- 值對象(Value Object):沒有唯一標識蜈彼,且屬性值不可變筑辨,小二簡單的對象,比如Date幸逆。
- 領域服務(Domain Service): 協(xié)調多個領域對象棍辕,只有方法沒有狀態(tài)(不存數(shù)據(jù))暮现;可以分為應用層服務,領域層服務楚昭、基礎層服務栖袋。
- 聚合及聚合根(Aggregate,Aggregate Root):聚合定義了一組具有內聚關系的相關對象的集合抚太;聚合根是對聚合引用的唯一元素塘幅;當修改一個聚合時,必須在事務級別尿贫;大部分領域模型中电媳,有70%的聚合通常只有一個實體,30%只有2~3個實體庆亡;如果一個聚合只有一個實體匾乓,那么這個實體就是聚合根;如果有多個實體身冀,那么我們可以思考聚合內哪個對象有獨立存在的意義并且可以和外部直接進行交互钝尸;
- 工廠(Factory):類似于設計模式中的工廠模式。
- 倉儲(Repository):持久化到DB搂根,管理對象珍促,且只對聚合設計倉儲。
-
- 聚合:比如一輛汽車(Car)包含了引擎(Engine)剩愧、車輪(Wheel)和油箱(Tank)等組件猪叙,缺一不可。
命令查詢職責分離(CQRS)
CQRS — Command Query Responsibility Seperation
-
- 核心思想:讀寫分離(查詢和更新在不同的方法中)芒帕,不同的流程只是不同的設計方式,CQ代碼分離丰介,分布式環(huán)境中會有明顯體現(xiàn)(有冗余數(shù)據(jù)的情況下)背蟆,目的是為了高性能。
-
《DDD CQRS架構和傳統(tǒng)架構的優(yōu)缺點比較》
- 最終一致的設計理念哮幢;依賴于高可用消息中間件带膀。
-
- 一個實現(xiàn) CQRS 的抽象案例。
-
《深度長文:我對CQRS/EventSourcing架構的思考》
- CQRS 模式分析 + 12306 搶票案例
貧血橙垢,充血模型
-
《貧血垛叨,充血模型的解釋以及一些經驗》
- 失血模型:老子和兒子分別定義,相互不知道柜某,二者實體定義中完全沒有業(yè)務邏輯嗽元,通過外部Service進行關聯(lián)敛纲。
- 貧血模型:老子知道兒子,兒子也知道老子还棱;部分業(yè)務邏輯放到實體中载慈;優(yōu)點:各層單項依賴,結構清楚珍手,易于維護办铡;缺點:不符合OO思想,相比于充血模式琳要,Service層較為厚重寡具;
- 充血模型:和貧血模型類似,區(qū)別在于如何劃分業(yè)務邏輯稚补。優(yōu)點:Service層比較薄童叠,只充當Facade的角色,不和DAO打交道课幕、復合OO思想厦坛;缺點:非單項依賴,DO和DAO之間雙向依賴乍惊、和Service層的邏輯劃分容易造成混亂杜秸。
- 腫脹模式:是一種極端情況,取消Service層润绎、全部業(yè)務邏輯放在DO中撬碟;優(yōu)點:符合OO思想、簡化了分層莉撇;缺點:暴露信息過多呢蛤、很多非DO邏輯也會強行并入DO。這種模式應該避免棍郎。
- 作者主張使用貧血模式其障。
Actor 模式
TODO
響應式編程
Reactor
TODO
RxJava
TODO
Vert.x
TODO
DODAF2.0
Serverless
TODO
Service Mesh
TODO
項目管理
架構評審
重構
代碼規(guī)范
TODO
代碼 Review
制度還是制度!
另外涂佃,每個公司需要根據(jù)自己的需求和目標制定自己的 check list
-
- 代碼 review 做的好,在于制度建設巡李。
RUP
看板管理
SCRUM
SCRUM - 爭球
- 3個角色:Product Owner(PO) 產品負責人;Scrum Master(SM),推動Scrum執(zhí)行;Team 開發(fā)團隊扶认。
- 3個工件:Product Backlog 產品TODOLIST侨拦,含優(yōu)先級;Sprint Backlog 功能開發(fā) TODO LIST;燃盡圖辐宾;
- 五個價值觀:專注狱从、勇氣膨蛮、公開、承諾季研、尊重敞葛。
敏捷開發(fā)
TODO
極限編程(XP)
XP - eXtreme Programming
-
《主流敏捷開發(fā)方法:極限編程XP》
是一種指導開發(fā)人員的方法論与涡。
-
4大價值:
- 溝通:鼓勵口頭溝通惹谐,提高效率。
- 簡單:夠用就好驼卖。
- 反饋:及時反饋氨肌、通知相關人。
- 勇氣:提倡擁抱變化酌畜,敢于重構怎囚。
5個原則:快速反饋、簡單性假設桥胞、逐步修改恳守、提倡更改(小步快跑)、優(yōu)質工作(保證質量的前提下保證小步快跑)贩虾。
5個工作:階段性沖刺催烘;沖刺計劃會議;每日站立會議整胃;沖刺后review颗圣;回顧會議。
結對編程
邊寫碼屁使,邊review在岂。能夠增強代碼質量、減少bug蛮寂。
FMEA管理模式
TODO
通用業(yè)務術語
TODO
技術趨勢
TODO
政策蔽午、法規(guī)
TODO
法律
嚴格遵守刑法253法條
我國刑法第253條之一規(guī)定:
- 國家機關或者金融、電信酬蹋、交通及老、教育、醫(yī)療等單位的工作人員范抓,違反國家規(guī)定骄恶,將本單位在履行職責或者提供服務過程中獲得的公民個人信息,出售或者非法提供給他人匕垫,情節(jié)嚴重的僧鲁,處3年以下有期徒刑或者拘役,并處或者單處罰金。
- 竊取或者以其他方法非法獲取上述信息寞秃,情節(jié)嚴重的斟叼,依照前款的規(guī)定處罰。
- 單位犯前兩款罪的春寿,對單位判處罰金朗涩,并對其直接負責的主管人員和其他直接責任人員,依照各該款的規(guī)定處罰绑改。
最高人民法院谢床、最高人民檢察院關于執(zhí)行《中華人民共和國刑法》確定罪名的補充規(guī)定(四)規(guī)定:觸犯刑法第253條之一第1款之規(guī)定,構成“出售绢淀、非法提供公民個人信息罪”萤悴;觸犯刑法第253條之一第2款之規(guī)定,構成“非法獲取公民個人信息罪”
架構師素質
-
- 業(yè)務理解和抽象能力
- NB的代碼能力
- 全面:1. 在面對業(yè)務問題上皆的,架構師腦海里是否會浮現(xiàn)出多種技術方案庶艾;2. 在做系統(tǒng)設計時是否考慮到了足夠多的方方面面囚巴;3. 在做系統(tǒng)設計時是否考慮到了足夠多的方方面面漆魔;
- 全局:是否考慮到了對上下游的系統(tǒng)的影響部宿。
- 權衡:權衡投入產出比;優(yōu)先級和節(jié)奏控制楞抡;
-
- 要去考慮的細節(jié):模塊化、輕耦合召廷、無共享架構凳厢;減少各個組件之前的依懶、注意服務之間依懶所有造成的鏈式失敗及影響等竞慢。
- 基礎設施先紫、配置、測試筹煮、開發(fā)遮精、運維綜合考慮。
- 考慮人败潦、團隊本冲、和組織的影響。
-
- 素質:業(yè)務理解、技術廣度沟饥、技術深度疮胖、豐富經驗环戈、溝通能力、動手能力澎灸、美學素養(yǎng)。
- 成長路徑:2年積累知識遮晚、4年積累技能和組內影響力性昭、7年積累部門內影響力、7年以上積累跨部門影響力县遣。
-
- 第一層的架構師看到的只是產品本身
- 第二層的架構師不僅看到自己的產品,還看到了整體的方案
- 第三層的架構師看到的是商業(yè)價值
團隊管理
TODO
招聘
資訊
行業(yè)資訊
公眾號列表
TODO
博客
團隊博客
個人博客
綜合門戶萧求、社區(qū)
國內:
CSDN
老牌技術社區(qū)其兴、不必解釋。-
- 偏 Java 方向
-
- 偏 Linux 方向
-
- 涵蓋 IT職場夸政、Web前端元旬、后端、移動端守问、數(shù)據(jù)庫等方面內容匀归,偏技術端。
國外:
問答耗帕、討論類社區(qū)
-
segmentfault
- 問答+專欄
- 知乎
- stackoverflow
行業(yè)數(shù)據(jù)分析
專項網站
-
測試:
-
運維:
-
Java:
-
ImportNew
- 專注于 Java 技術分享
-
HowToDoInJava
- 英文博客
-
ImportNew
-
安全
-
大數(shù)據(jù)
-
其他專題網站:
-
DockerInfo
- 專注于 Docker 應用及咨詢穆端、教程的網站。
-
Linux公社
- Linux 主題社區(qū)
-
DockerInfo
其他類
推薦參考書
在線電子書
紙質書
開發(fā)方面
架構方面
- 《軟件架構師的12項修煉:技術技能篇》京東 淘寶
- 《架構之美》京東 淘寶
- 《分布式服務架構》京東 淘寶
- 《聊聊架構》 京東 淘寶
- 《云原生應用架構實踐》京東 淘寶
- 《億級流量網站架構核心技術》京東 淘寶
- 《淘寶技術這十年》京東 淘寶
- 《企業(yè)IT架構轉型之道-中臺戰(zhàn)略思想與架構實戰(zhàn)》 京東 淘寶
技術管理方面
基礎理論
工具方面
TODO
大數(shù)據(jù)方面
技術資源
開源資源
手冊仿便、文檔体啰、教程
國內:
-
- HTML 、 CSS嗽仪、XML荒勇、Java、Python钦幔、PHP枕屉、設計模式等入門手冊。
-
- 很多很多中文在線電子書鲤氢,是一個全新的開源技術文檔分享平臺搀擂。
-
- 付費電子書。
-
- AI卷玉、大數(shù)據(jù)方面系列中文文檔哨颂。
國外:
-
Quick Code
- 免費在線技術教程。
-
gitbook.com
- 有部分中文電子書相种。
-
Cheatography
- Cheat Sheets 大全威恼,單頁文檔網站。
在線課堂
會議箫措、活動
活動發(fā)布平臺:
常用APP
找工作
工具
-
極客搜索
- 技術文章搜索引擎腹备。
代碼托管
文件服務
- 七牛
- 又拍云