「中間件」消息中間件如何實現每秒幾十萬的高併發寫入?

在這裏插入圖片描述

前言

用過消息中間件的都知道能夠解決業務中的性能瓶頸,那麼消息中間件如何實現每秒幾十萬的高併發寫入?
消息中間件存儲

首先理解一點,消息中間件一般都是存儲在磁盤上的,大家都知道直接在磁盤讀寫是有性能瓶頸的,不可能達到每秒幾十萬的吞吐量,那麼消息中間件是怎麼保證讀寫性能的呢?

寫數據

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緩存區。

這樣我們就減少了一半的數據拷貝,縮短時間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章