? ? ? ?以前看zookeeper只知道是在分布式應(yīng)用程序環(huán)境中起到協(xié)調(diào)通知的作用,但一直都未在具體項目中應(yīng)用過。正好最近業(yè)務(wù)中有這樣的場景,就拿來實踐了一下。
? ? ? 業(yè)務(wù)場景:通過頁面將一些人工配置的數(shù)據(jù)保存下來,客戶端通過服務(wù)端暴露的restful接口來請求到這些數(shù)據(jù)。服務(wù)端大約20來個節(jié)點,當(dāng)時考慮通過將數(shù)據(jù)緩存到redis中,然后每個請求過來直接到redis機器上取數(shù)據(jù)。這些數(shù)據(jù)大部分時間不會有太大變化,但人工還有可能隨時變更,重新保存,而且客戶端過來的請求量很大,并且每次請求里面可能都會循環(huán)多次去連redis取??紤]到到redis中取雖然是ms級,但是對于大量請求來說開辟連接、網(wǎng)絡(luò)io對性能來說也是一筆不小的開銷。
? ? ? ?考慮使用zk:如果我將這些不是太經(jīng)常變更的數(shù)據(jù)直接放進本機的內(nèi)存對象里面,取的時候讀本機內(nèi)存,那樣響應(yīng)速度將大大提升。但是節(jié)點不同,對象也不同,如何保證數(shù)據(jù)一致。此時可以考慮到zk的監(jiān)聽機制。利用內(nèi)存對象 、redis、zk實現(xiàn)不同節(jié)點數(shù)據(jù)同步。保存數(shù)據(jù)時候可以存入redis中,同時創(chuàng)建一個zk臨時節(jié)點并塞入當(dāng)前時間戳數(shù)據(jù)。監(jiān)聽端,創(chuàng)建zk監(jiān)聽機制,當(dāng)需要人工重新更改配置數(shù)據(jù)時候,將會引起zk的節(jié)點發(fā)生變化,此時zk及時監(jiān)聽到通知各節(jié)點將redis中最新數(shù)據(jù)存入各個節(jié)點對象中,這樣就能保證數(shù)據(jù)是最新的而且一致性。