天天看點

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

大家好,通過第一篇的快速使用,大家已經對diamond有了一個基本的了解。本次為大家帶來的是diamond核心原理的介紹,主要包括server叢集的資料同步、client擷取server位址、client從server擷取資料、client運作時感覺server的資料變化,這四部分。

<a></a>

一、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請求一次資料,拿回資料後回調監聽器。

本文來源于"阿裡中間件團隊播客",原文發表時間" 2012-04-17"

繼續閱讀