原文地址: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請求一次數據,拿回數據後回調監聽器。