昨天剛發(fā)布了FastCFS V1.3.0,修復了4個穩(wěn)定性相關bug,重構了客戶端連接管理,實現(xiàn)了更優(yōu)雅的failover機制,以及更高的讀寫性能,歡迎大家測試和使用。今天著重向大家介紹FastCFS的連接管理機制。
FastCFS一開始就使用libfastcommon提供的連接池來管理連接。使用連接池的好處是不用每次請求都新建連接,通過池化技術實現(xiàn)了連接復用,最小化建連開銷。只有底層的連接池還不夠,還有如下兩個問題需要解決:1. 請求發(fā)送給哪臺服務器(服務實例)?2. 服務器不可用如何處理?
對于問題1,發(fā)送數(shù)據(jù)讀寫請求前,獲取對應的服務器即可。以前的做法是每次都詢問服務器,因此多了一次網絡請求。改進后的做法:一次獲取一個分組的可用服務器列表并緩存到本地,后續(xù)請求直接使用本地緩存的可用服務器。如果請求一臺服務器失敗,將該服務器從可用列表中摘除。
對于問題2,因為以前的做法沒有在本地維護可用服務器列表,當有服務器不可用時,依然會嘗試連接該服務器,從而導致請求的響應時間變長。改進后的方案會面臨另外一個問題,對于不可用服務器,如何感知到它又可用了呢?簡單直接的解決方法,定期探測該服務器是否可用。FastCFS的做法雷同,當有服務器不可用時,后臺線程定期獲取可用服務器列表,若有變化,則更新本地緩存。
概括一下FastCFS的連接管理機制:本地緩存可用服務器列表 + 后臺線程檢測服務器是否可用。
|