教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Zookeeper之Publish/Subscribe(發(fā)布/訂閱)模式

更新時(shí)間:2020年10月30日17時(shí)04分 來源:傳智播客 瀏覽次數(shù):

數(shù)據(jù)發(fā)布/訂閱(Publish/Subscribe)系統(tǒng),即所謂的配置中心,顧名思義就是發(fā)布者將數(shù)據(jù)發(fā)布到ZooKeeper的一個(gè)或一系列節(jié)點(diǎn)上,供訂閱者進(jìn)行數(shù)據(jù)訂閱,進(jìn)而達(dá)到動態(tài)獲取數(shù)據(jù)的目的,實(shí)現(xiàn)配置信息的集中式管理和數(shù)據(jù)的動態(tài)更新。

發(fā)布/訂閱系統(tǒng)一般有兩種設(shè)計(jì)模式,分別是推(Push)模式和拉(Pull)模式。在推模式中,服務(wù)端主動將數(shù)據(jù)更新發(fā)送給所有訂閱的客戶端;而拉模式則是由客戶端主動發(fā)起請求來獲取最新數(shù)據(jù),通??蛻舳硕疾捎枚〞r(shí)進(jìn)行輪詢拉取的方式。

ZooKeeper 采用的是推拉相結(jié)合的方式:客戶端向服務(wù)端注冊自己需要關(guān)注的節(jié)點(diǎn),一旦該節(jié)點(diǎn)的數(shù)據(jù)發(fā)生變更,那么服務(wù)端就會向相應(yīng)的客戶端發(fā)送Watcher事件通知,客戶端接收到這個(gè)消息通知之后,需要主動到服務(wù)端獲取最新的數(shù)據(jù)。

如果將配置信息存放到ZooKeeper上進(jìn)行集中管理,那么通常情況下,應(yīng)用在啟動的時(shí)候都會主動到ZooKeeper服務(wù)端上進(jìn)行一次配置信息的獲取,同時(shí),在指定節(jié)點(diǎn)上注冊一個(gè)Watcher監(jiān)聽,這樣一來,但凡配置信息發(fā)生變更,服務(wù)端都會實(shí)時(shí)通知到所有訂閱的客戶端,從而達(dá)到實(shí)時(shí)獲取最新配置信息的目的。

下面我們通過一個(gè)“配置管理”的實(shí)際案例來展示ZooKeeper在“數(shù)據(jù)發(fā)布/訂閱”場景下的使用方式。

在我們平常的應(yīng)用系統(tǒng)開發(fā)中,經(jīng)常會碰到這樣的需求:系統(tǒng)中需要使用一些通用的配置信息,例如機(jī)器列表信息、運(yùn)行時(shí)的開關(guān)配置、數(shù)據(jù)庫配置信息等。這些全局配置信息通常具備以下3個(gè)特性。

·數(shù)據(jù)量通常比較小。

·數(shù)據(jù)內(nèi)容在運(yùn)行時(shí)會發(fā)生動態(tài)變化。

·集群中各機(jī)器共享,配置一致。

對于這類配置信息,一般的做法通常可以選擇將其存儲在本地配置文件或是內(nèi)存變量中。無論采用哪種方式,其實(shí)都可以簡單地實(shí)現(xiàn)配置管理,在集群機(jī)器規(guī)模不大、配置變更不是特別頻繁的情況下,無論剛剛提到的哪種方式,都能夠非常方便地解決配置管理的問題。但是,一旦機(jī)器規(guī)模變大,且配置信息變更越來越頻繁后,我們發(fā)現(xiàn)依靠現(xiàn)有的這兩種方式解決配置管理就變得越來越困難了。我們既希望能夠快速地做到全局配置信息的變更,同時(shí)希望變更成本足夠小,因此我們必須尋求一種更為分布式化的解決方案

接下來我們就以一個(gè)“數(shù)據(jù)庫切換”的應(yīng)用場景展開,看看如何使用ZooKeeper來實(shí)現(xiàn)配置管理:

·配置存儲

在進(jìn)行配置管理之前,首先我們需要將初始化配置信息存儲到Zookeeper上去,一般情況下,我們可以在Zookeeper上選取一個(gè)數(shù)據(jù)節(jié)點(diǎn)用于配置信息的存儲,例如:/app1/database_config。

1604038092090_001.jpg

配置管理的zookeeper節(jié)點(diǎn)示意圖

我們將需要管理的配置信息寫入到該數(shù)據(jù)節(jié)點(diǎn)中去,例如:

#數(shù)據(jù)庫配置信息
#DBCP
dbcp.driverClassName=com.mysql.jdbc.Driver
dbcp.dbJDBCUrl=jdbc:mysql://127.0.0.1:3306/lagou-test
dbcp.username=zm
dbcp.password=1234
dbcp.maxActive=30
dbcp.maxIdle=10

配置獲取

集群中每臺機(jī)器在啟動初始化階段,首先會從上面提到的ZooKeeper配置節(jié)點(diǎn)上讀取數(shù)據(jù)庫信息,同時(shí),客戶端還需要在該配置節(jié)點(diǎn)上注冊一個(gè)數(shù)據(jù)變更的 Watcher監(jiān)聽,一旦發(fā)生節(jié)點(diǎn)數(shù)據(jù)變更,所有訂閱的客戶端都能夠獲取到數(shù)據(jù)變更通知。

配置變更

在系統(tǒng)運(yùn)行過程中,可能會出現(xiàn)需要進(jìn)行數(shù)據(jù)庫切換的情況,這個(gè)時(shí)候就需要進(jìn)行配置變更。借助ZooKeeper,我們只需要對ZooKeeper上配置節(jié)點(diǎn)的內(nèi)容進(jìn)行更新,ZooKeeper就能夠幫我們將數(shù)據(jù)變更的通知發(fā)送到各個(gè)客戶端,每個(gè)客戶端在接收到這個(gè)變更通知后,就可以重新進(jìn)行最新數(shù)據(jù)的獲取。


猜你喜歡:

ZooKeeper視頻教程下載

Sentinel視頻教程:阿里分布式服務(wù)架構(gòu)流量控制組件Sentinel視頻教程

0 分享到:
和我們在線交談!