diamond專題(二)– 核心原理介紹

原文地址:http://rdc.taobao.com/team/jm/archives/1592

大家好,通過第一篇的快速使用,大家已經對diamond有了一個基本的瞭解。本次爲大家帶來的是diamond核心原理的介紹,主要包括server集羣的數據同步、client獲取server地址、client從server獲取數據、client運行時感知server的數據變化,這四部分。

一、server集羣數據同步

diamond-server將數據存儲在mysql和本地文件中,mysql是一箇中心,diamond認爲存儲在mysql中的數據絕對正確,除此之外,server會將數據存儲在本地文件中。

同步數據有兩種方式:

(1)server寫數據時,先將數據寫入mysql,然後寫入本地文件,寫入完成後發送一個HTTP請求給集羣中的其他server,其他server收到請求,從mysql中dump剛剛寫入的數據至本地文件。

(2)server啓動後會啓動一個定時任務,定時從mysql中dump所有數據至本地文件。

二、client獲取server地址

diamond-client在使用時沒有指定server地址的代碼,地址獲取對用戶是透明的。

server地址存儲在一臺具有域名的機器上的HTTP server中,我們稱它爲地址服務器,diamond-client使用前需要在本地進行正確的域名綁定,啓動時它會根據域名綁定,去對應環境的地址服務器上獲取diamond-server地址列表。

獲取的地址列表,會保存在client本地,當出現網絡異常,無法從網絡獲取地址列表時,client會使用本地保存的地址列表。

client啓動後會啓動一個定時任務,定時從HTTP server上獲取地址列表並保存在本地,以保證地址是最新的。

三、client主動獲取數據

client調用getAvailableConfigInfomation(), 即可獲取一份最新的可用的配置數據,獲取過程實際上是拼接http url,使用http-client調用http method的過程。

爲了避免短時間內大量的獲取數據請求發向server,client端實現了一個帶有過期時間的緩存,client將本次獲取到的數據保存在緩存中,在過期時間內的所有請求,都返回緩存內的數據,不向server發出請求。

四、client運行中感知數據變化

這是diamond最爲核心的一個功能。

這個特性是通過比較client和server的數據的MD5值實現的。

server在啓動時,會將所有數據的MD5加載到內存中(MD5根據某算法得出,保證數據內容不同,MD5不同,MD5存儲在mysql中),數據更新時,會更新內存中對應的MD5

client在啓動並第一次獲取數據後,會將數據的MD5保存在內存中,並且在啓動時會啓動一個定時任務,定時去server檢查數據是否變化。每次檢查時,client將MD5傳給server,server比較傳來的MD5和自身內存中的MD5是否相同,如果相同,說明數據沒變,返回一個標示數據不變的字符串給client;如果不同,說明數據變了,返回變化數據的dataId和group給client.  client收到變化數據的dataId和group,再去server請求一次數據,拿回數據後回調監聽器。

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