在討論數據中間件是什么之前,我們先來討論什么是中間件。
維基百科對中間件的定義:
中間件(英語:Middleware),又譯中間件、中介層,是一類提供系統軟件和應用軟件之間連接、便于軟件各部件之間的溝通的軟件,應用軟件可以借助中間件在不同的技術架構之間共享信息與資源。中間件位于客戶機服務器的操作系統之上,管理著計算資源和網絡通信。
常見的中間件有如下幾類
· RPC框架
· 消息中間件
· 緩存服務
· 配置中心
· 任務調度
· 分布式事務
· 數據庫
數據相關的中間件主要有:
數據庫:數據庫是數據存儲的主要,由于需要寫到緩存,包括關系型數據庫(常見的mysql、oracal)、非關系型數據等(elasticsearch、hbase等)
緩存服務: 內存數據庫,數據直接運行在內存中,加快訪問速度,常見的比如redis、memcached
消息隊列: 消息的傳輸過程中保存消息的容器。常見的比如rocketmq、kafka
數據中間件能做些什么?
盡管云原生開發存在諸多好處,但它同時也增加了復雜性。從本地系統到公共云,您可能會跨多種基礎架構來部署應用。而應用架構本身也是多種多樣。所以開發人員需要兼顧多種工具、語言和框架,同時還要竭力爭取在更短的時間內以更低的成本完成更多工作,這無疑壓力倍增。
為了應對這種復雜情況,企業紛紛選擇了中間件來保持快速、經濟高效的應用開發。中間件可以有力支持應用環境在高度分布式平臺上平穩、一致地運行。
構建于此,而部署于彼。由于應用下層有中間件,所以跨環境也能穩定運行。
數據庫
數據庫可以直觀的理解為存放數據的倉庫,只不過這個倉庫是在計算機的大容量存儲器上,而且數據必須按照一定的格式存放,因為它不僅需要存放,而且要便于查找。
緩存服務
在計算機領域,緩存技術一般是指,用一個更快的存儲設備存儲一些經常用到的數據,供用戶快速訪問。用戶不需要每次都與慢設備去做交互,因此可以提高訪問效率。
分布式緩存就是指在分布式環境或系統下,把一些熱門數據存儲到離用戶近、離應用近的位置,并盡量存儲到更快的設備,以減少遠程數據傳輸的延遲,讓用戶和應用可以很快訪問到想要的數據。通常在應用訪問數據庫中間加一層緩存提高獲取數據的速率。
圖:緩存服務的場景
消息隊列
消息隊列主要由以下作用:解耦,削峰,異步,其實還有一個作用是提高接收著性能。
· 解耦: 多個交互的應用程度可以獨立變動,而無需太多考慮其他系統
· 削峰: 將流量高的時間平攤到不那么高的時候
· 異步: 異步處理不用阻塞當前線程來等待處理完成,而是允許后續操作
圖:消息隊列的場景
組件名稱 |
作用 |
特點 |
數據庫 |
數據存儲,提供數據讀寫的功能 |
高安全性 |
緩存 |
主要提供數據庫快速查詢 |
高性能、高并發 |
消息隊列 |
解耦業務、異步傳輸、流程削峰 |
高性能,擴展業務 |
如何建立數據中間件?
數據中間件本質是提高單機/分布式環境下 提交數據交互的速率和穩定性。
那么我們先來回顧一下操作系統原理,計算機系統中包含各類存儲,從CPU寄存器到網絡IO速率是依次遞減。那么就需要在成本限定的前提下盡可能利用好高IO設備。
圖:各類設備的IO速度
在物理資源不變的情況下,對于提高性能無非幾種方法。
在非分布式環境下 通過數據結構優化/緩存/緩沖,分布式環境下數據復制+讀寫分離/數據分片
穩定性主要考慮的就是宕機/網絡故障
數據存儲(數據庫)
數據庫通常需要提供sql進行數據請求,由sql解析器進行語法解析,同時經過優化器進行語法優化,最后根據不同的存儲引擎在緩存中讀取數據。
圖:Mysql數據庫的架構
數據庫中用到了下面幾種重要的原理:
索引
建立索引提高讀取數據尋址的效率, 想想一下同樣大小的文件夾(包含大量小文件)和壓縮包,考慮的速率肯定是壓縮包更快。前置是不連續地址,后者是連續地址。比如mysql主要通過b+樹索引快速定位索引的內存位置并且獲取數據。
內存緩存
雖然索引能夠很大的提高速率,但是無法一次性將所有索引保存在內存中。 雖然linux內部提供page cache等方式提高,但是通常為了更加提高數據讀寫性能,通常自己另外實現一套應用級別的緩沖,比如mysql的buffer pool機制,通過索引在讀數據時可以很大程度上減少磁盤IO的次數,大大提高了數據搜尋的速率。
其他
單機環境,再優化也會有性能瓶頸,同時無法應對宕機和網絡故障問題,只能通過擴展解決。
常規的業務環境往往是讀多寫少,可以通過讀寫分離,大大提高讀的性能,也能做到數據的冗余備份。
緩存服務
這里的緩存不是特應用的內部緩存,而是獨立的緩存服務(也可以叫做內存數據庫)。
圖:緩存與數據庫的讀寫交互
寫流程:
1. 要更新的數據是否在緩存中存在,若存在則直接將數據寫入緩存,之后緩存數據由第三方緩存組件將其更新到DB.
2. 若緩存中不存在,則直接將結果寫入DB,這種稱之為寫穿透
讀流程:
1. 首先讀緩存,如果緩存命中,則直接返回結果
2. 如果緩存未命中,則依賴第三方組件從DB 中加載數據到緩存中,然后將獲取的結果返回。
內存緩存
這里說的內存緩存和數據庫存在差異,由于數據庫的安全性,需要經常落盤,那么就會帶來很多問題;而緩存服務本身就作為內存數據庫落盤不那么頻繁。
當你訪問數據庫,存在大量的qps導致數據庫跟不上性能,那么可以通過緩存解決,相對于數據庫需要經常落盤,緩存大部分時間是無需落盤,內存IO的速度比磁盤IO快了很多,所以緩存往往是作為應用訪問數據庫的中間件層提高性能。
其他
由于緩存讀多,很少使用數據庫的事務,所以在數據分片實現是更加容易,擴展性也相對于數據庫更加方便。
消息隊列
消息隊列是從數據結構中的隊列(FIFO)中演變過來的,作為獨立的隊列,通過網絡寫入和讀取數據。
異步處理:
有些業務不想也不需要立即處理消息。消息隊列提供了異步處理機制,允許用戶把一個消息放入隊列,但并不立即處理它。想向隊列中放入多少消息就放多少,然后在需要的時候再去處理它們,例如短信通知、終端狀態推送、App推送、用戶注冊等。
圖:緩存異步讀寫
系統解耦:
降低工程間的強依賴程度,針對異構系統進行適配。在項目啟動之初來預測將來項目會碰到什么需求,是極其困難的。通過消息系統在處理過程中間插入了一個隱含的、基于數據的接口層,兩邊的處理過程都要實現這一接口,當應用發生變化時,可以獨立的擴展或修改兩邊的處理過程,只要確保它們遵守同樣的接口約束。比如通訊上下行、終端異常監控、分布式事件中心。
圖:緩存用作應用解耦
數據流處理:
分布式系統產生的海量數據流,如:業務日志、監控數據、用戶行為等,針對這些數據流進行實時或批量采集匯總,然后進行大數據分析是當前互聯網的必備技術,通過消息隊列完成此類數據收集是最好的選擇,比如日志服務、監控上報。
圖:緩存用作數據流處理
數據中間件的發展趨勢
1. 基于云原生環境的智能運維和擴展能力
對于中間件設施的開發和運維人員來說,中間件復雜的架構是難點。
目前云原生技術越來越成熟,可以充分利用云原生的聲明式API,控制器模型擴展中間件,使其更加智能穩定。
比如目前開源的各類中間件operator的項目
https://kubernetes.io/zh/docs/concepts/extend-kubernetes/operator/
圖:operator 原理
2. 統一的編程模型
對于應用的使用者來說,需要了解不同的中間件如何使用,同時需要考慮很多復雜的場景。編寫高性能、可擴展且可靠的分布式應用程序很困難??梢允褂猛坏木幊棠P推帘蔚讓拥膹碗s場景。
Dapr項目是一個有趣的項目,它將事件驅動和參與者語義統一到一個簡單、一致的編程模型中。它支持所有編程語言,沒有框架鎖定。您不會接觸到低級原語,例如線程、并發控制、分區和縮放。相反,您可以通過使用您選擇的熟悉的 Web 框架實現一個簡單的 Web 服務器來編寫代碼。
圖:operator hub