前言
用過消息中間件的都知道能夠解決業務中的性能瓶頸,那麼消息中間件如何實現每秒幾十萬的高併發寫入?
消息中間件存儲
首先理解一點,消息中間件一般都是存儲在磁盤上的,大家都知道直接在磁盤讀寫是有性能瓶頸的,不可能達到每秒幾十萬的吞吐量,那麼消息中間件是怎麼保證讀寫性能的呢?
寫數據
1、消息中間件是基於操作系統的頁緩存來實現文件寫入的。操作系統本身有一層緩存,叫做page cache,是在內存裏的緩存,我們也可以稱之爲os cache,意思就是操作系統自己管理的緩存。
我們在寫入磁盤文件的時候,可以直接寫入這個os cache裏,也就是僅僅寫入內存中,接下來由操作系統自己決定什麼時候把os cache裏的數據真的刷入磁盤文件中。也就是說我們寫是挨個寫入緩存中,系統批量寫入磁盤。
2、寫磁盤文件並不是隨機添加的,而是在文件末尾追加的,這也就保證了消息在單個磁盤文件的順序性(多分區就不能保證順序了)。
讀數據
1、消息中間件讀數據也是從os cache中讀取的,如果os cache中沒有,系統會去磁盤中批量讀取一部分數據,放入os cache中。
2、消息中間件用到一種叫做零拷貝的技術。
一般我們完成一次網絡傳輸拷貝,需要以下幾步:
1)調用read系統接口,將數據從磁盤文件拷貝到讀內核緩衝區。
2)從讀內核緩衝區拷貝到用戶空間緩存;
3)調用write系統接口,將數據從用戶空間拷貝到寫內核空間緩衝區。
4)將數據從內核空間緩衝區拷貝到socket緩存衝,準備網絡傳輸。
上面我們可以看出,一共進行了四次數據拷貝。使用零拷貝技術,我們調用mmap接口,在用戶空間和內核空間共享一段內存。這樣我們就只需要兩次拷貝。
1)將磁盤文件數據拷貝到mmap共享內存區。
2)將數據從mmap共享內存區拷貝到socket緩存區。
這樣我們就減少了一半的數據拷貝,縮短時間。