緩衝機制是對數據持久化的延遲,減少不必要的IO,提高數據落盤的效率。本文將會詳細探討擁有雙Buffer的緩衝池(下文統稱TwinsBufferPool)是如何實現的,讀者可以依此推廣,得到N-Buffer的實現原理。
在此篇文章中,緩衝區(Buffer)和緩衝池(BufferPool)是兩個重要的概念,很明顯,兩者構成了一個包含與被包含的關係,一個緩衝池內可以有一個或者多個緩衝區協同工作,緩衝池中的所有緩衝區被組織成了一個環形隊列,一前一後的兩個緩衝區可以互相替換角色。
當然,在整個過程中,還會有其他輔助工具的出現,在下文都會逐一闡述。
一、設計要點
1、可擴展性。毫無疑問,可擴展性是對一個設計良好的軟體的一項基本要求,而一個軟體的可擴展的地方通常是有很多處的,這在某種程度上會依賴於編程者的經驗,如果僅僅侷限於產品需求,可能會嚴重限制了軟體的可擴展性。緩衝池是一種相對通用的中間件,擴展點相對比較多,比如:緩衝區數量可指定,線程安全與否,緩衝區閾值調配等等。
2、易用性。設計出來的中間件應該是對用戶友好的,使用過程中不會有繁瑣的配置,奇形怪狀的API,更不能有諸多不必要的Dependencies,如果能做到代碼無侵入性,那就非常完美了。基於這個要求,TwinsBufferPool做成了一個Spring Boot Starter的形式,加入到項目裏的dependencies中即可開啟使用。
3、穩定性。這就是衡量一個中間件好壞的重要KPI之一,從外觀上看,同樣是一艘船,破了一個洞和完好無缺將會是一個致命的區別,用戶期望自己搭上了一艘完整的船,以便能航行萬裏而無憂。
4、高效性。說到穩定性,那就不得不說高效了,如果能幫助用戶又好又快的解決問題,無疑是最完美的結果。關於TwinsBufferPool的穩定性和高效性兩個指標,會在文中附上jemeter的壓測結果,並加以說明。
二、設計方案
這一小節將會給出TwinsBufferPool完整的設計方案,我們先從配置說起。
每個參數都會提供默認值,所以不做任何配置也是允許的。如下是目前TwinsBufferPool能提供的配置參數(yml):
buffer:
capacity: 2000
threshold: 0.5
allow-duplicate: true
pool:
enable-temporary-storage: true
buffer-time-in-seconds: 120
下面附上參數說明表: