如何思考問題與思考具體問題同等重要。html
如何思考一個技術問題?如何高效地理解某個技術 ?如何快速學習一個新的技術點 ? 這都須要一個好的技術思考框架。缺少思考框架,知識和技術就變成一堆細節的堆砌,缺少關聯,難以理解和記憶,也就難以掌握和應用。程序員
本文來探索一種好的技術思考框架。
redis
在多年的開發生涯及閱讀和理解源碼的過程當中,我逐漸造成了一種我的以爲比較可行的技術思考框架:「抽象-思路-考量-優化-細節」 五步曲。算法
抽象數據庫
抽象很是重要。一個典型的例子是刪除操做。刪除操做提供的是「用戶不可見」的抽象。能夠採用兩種思路:緩存
能夠看到,提供良好的抽象,而不是直覺上按照用戶的要求去作,每每會帶來更靈活的設計空間。安全
抽象最好能用一句話歸納。好比,文字編輯器(UI界面)提供的是「所見即所得」的抽象;理財產品提供的是符合利率模型的計算抽象。
服務器
思路網絡
思路是如何去基本實現的問題。在問題討論初期,提出儘量多種思路,應對不一樣的場景。好比排序,就有插入排序、冒泡排序、快速排序、合併排序、希爾排序、桶排序、外部排序、多關鍵字排序等。不一樣的排序具備不一樣的特性,在不一樣的場景下使用。挖掘儘量多的思路,有助於拓展對問題的思考。好的思路是成功的一半。架構
考量和優化
考量和優化每每須要豐富的開發實踐經驗。知道往哪一個方向使力,如何使力,須要解決什麼技術難點等。
細節
在掌握宏觀視角後,細節的打磨尤其重要。細節處理不當,可能會致使總體工做前功盡棄。程序員或工程師的一大特質,便是體如今細節的考慮和思惟的縝密上。
考慮各類錯誤和異常,考慮依賴服務、服務器、網絡等的不可靠,是作好細節工做的必要前提。
抽象
持久化,便是給用戶提供一個「數據保存了、即便掉電或重啓也能從某處找回數據」的抽象。
思路
如何實現 Redis 持久化 ? 持久化就是將 Redis 內存數據庫的數據集狀態保存在某個磁盤文件裏。能夠基於兩種思路:
考量
實際工程中要考慮什麼因素呢 ?
優化
針對上述考量因素,可制定相應優化措施:
細節
RDB 機制的細節:
AOF 機制的細節:
再來思考一個問題:如何應對高併發流量呢?這是互聯網應用必然面對的一個重大挑戰。
抽象
高併發流量問題,本質是資源有限的問題。便是用有限的資源去應對不肯定性的巨大流量的矛盾。假設有足夠的資源,加以適當的水平擴展,高併發也不算什麼事。難在用現有的架構、現有的資源來應對巨大流量,並且不管預留多少資源,老是不必定能承載將來可能降臨的超過負載能力的峯值流量。
思路
既然是資源有限的問題,那麼思路也就三條:
考量
優化
提高服務能力:
用好緩存:能夠提高 QPS ,但依然沒法阻擋高併發流量;
熔斷降級:高併發狀況下,自動熔斷次要的鏈路,提高 QPS;
讀寫分離: 將高併發流量中的讀寫部分分開,讀寫分別處理;
分庫分表: 提高 DB 的併發處理能力;
彈性擴容:要求應用可以彈性部署和啓動。在大促活動以前,能夠提早擴容。目前難以應對瞬時峯值。
加資源(在不一樣層面):
加資源的同時作好負載均衡(分流做用)。經過負載均衡進行分流,一部分流量直接進入服務器,一部分流量走消息隊列再走服務。負載均衡可採用七層的 ngnix 和 四層的 LVS 或 F5。負載均衡能抗住大流量;
多機房 + CDN:多機房 + CDN + 負載均衡,分別抗住來自不一樣地區的大流量。
限流: 仍然沒法承載的流量,採用限流處理掉。
細節
高併發其實是一個實操性很強的事情。沒有通過高併發流量的洗禮,只談理論終究仍是隔着點。不過,至少要了解相關理論,才能在實戰中積極運用並積累經驗。
從上述示例能夠看到:
抽象、考量和優化,須要建基於一個比較豐富的技術體系結構。爲何考慮這個問題而不考慮那個問題?爲何選擇優化這個而不是優化那個?技術知識點是很是繁雜瑣碎的,缺少技術體系結構來有效地組織起來,極可能會腦中一團漿糊,分不清東南西北,對着各類新技術望洋興嘆。
所以,打造一個適合本身的技術體系結構很是重要,這也是將來的核心競爭力之一。好比 「互聯網應用服務端的經常使用技術思想與機制綱要」 便是圍繞「數據處理」這個中心主題,從靈活性、高性能、高可用、高可靠、一致性、海量、安全、自動化、智能化八個方面打造的技術體系結構。這個體系結構幾乎能夠容納各類技術流派和技術優化手段。
本文探討了一種技術思考框架:基於技術體系結構的「抽象-思路-考量-優化-細節」五步曲。
合適的抽象會帶來更靈活的設計空間和思路,而考量則會決定優化的大方向,在優化的過程當中解決細節問題。在學習技術的過程當中,要逐步打造適合本身的技術體系結構,不斷充實這個體系結構,從而具有更強的系統思考力和技術吸取力。