1. 程式人生 > >Diamond詳解(2)-分析

Diamond詳解(2)-分析

原文:http://my.oschina.net/u/435621/blog/270484

大家好,通過第一篇的快速使用,大家已經對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請求一次資料,拿回資料後回撥監聽器。