最近的工作內(nèi)容是封裝一個(gè)高性能的sdk,以便和我們的配置中心進(jìn)行交互,這里整理一下我是如何設(shè)計(jì)
1. 需求分析我們要支持和配置中心的交互(網(wǎng)絡(luò)IO)
支持客戶端緩存功能,并且支持?jǐn)嚯娭貑ⅲ▋?nèi)存緩存+文件緩存)
配置中心沒有推送功能,sdk需要進(jìn)行輪詢(使用NIO網(wǎng)絡(luò)模型進(jìn)行輪詢)
這個(gè)點(diǎn)其實(shí)設(shè)計(jì)的并不好,最好是開啟一個(gè)長(zhǎng)鏈接,由服務(wù)端推送請(qǐng)求是最佳實(shí)現(xiàn),但是因?yàn)榕渲弥行暮涂蛻舳酥g有一個(gè)中間層,無法實(shí)現(xiàn)長(zhǎng)鏈接,不過這兩個(gè)在實(shí)現(xiàn)上是類似的
2. 任務(wù)分解針對(duì)網(wǎng)絡(luò)IO 提供兩套模型
當(dāng)緩存中沒有所需要的數(shù)據(jù)的時(shí)候,使用BIO直接讀服務(wù)端(緩存擊穿)
當(dāng)緩存的存在的時(shí)候, 將緩存的數(shù)據(jù)添加到輪詢隊(duì)列中,等待下一次異步同步更新
針對(duì)緩存設(shè)計(jì)
內(nèi)存緩存:除了需要提供一個(gè)數(shù)據(jù)緩存,還需要提供一個(gè)狀態(tài)同步集合來標(biāo)記緩存中數(shù)據(jù)的狀態(tài),比如是否超時(shí),是否有效等
針對(duì)這個(gè)情況我們需要實(shí)現(xiàn)一個(gè)功能類---狀態(tài)處理類,通過這個(gè)類來處理緩存中狀態(tài)同步集合的狀態(tài),并同步處理數(shù)據(jù)緩存對(duì)應(yīng)的狀態(tài)ps : 為什么設(shè)計(jì)成數(shù)據(jù)和狀態(tài)分離 -> 為了更高的可控性和解藕 1.如果需要狀態(tài)特殊處理的時(shí)候只需要拿出狀態(tài)隊(duì)列就可以進(jìn)行處理了不需要?jiǎng)泳彺?2. 如果狀態(tài)需要添加字段或者邏輯,只需要修改對(duì)應(yīng)的狀態(tài)隊(duì)列即可,不需要修改數(shù)據(jù)緩存
文件緩存: 這個(gè)本質(zhì)上很內(nèi)存緩存相似,只有一個(gè)點(diǎn)就是當(dāng)使用nio進(jìn)行數(shù)據(jù)同步的時(shí)候,nio從網(wǎng)絡(luò)中拉取的新數(shù)據(jù)需要同步更新緩存和文件,此時(shí)的文件操作應(yīng)該使用nio保證不堵塞。
輪詢方法
我在框架中使用的NIO網(wǎng)絡(luò)框架是vert.x 其實(shí)可以理解成java中的promise方法
這里我做的輪詢邏輯其實(shí)非常簡(jiǎn)單過程如下
拿到需要進(jìn)行輪詢隊(duì)列
for循環(huán)發(fā)起NIO網(wǎng)絡(luò)請(qǐng)求,并且處理結(jié)果
更新緩存狀態(tài)(更新緩存,處理超時(shí)等問題)
還需要那些改進(jìn)?
需要添加一個(gè)速率控制器,考慮這樣一個(gè)場(chǎng)景如果輪詢發(fā)起的請(qǐng)求過大,將可能會(huì)把配置中心打垮,所以sdk需要控制請(qǐng)求的速率動(dòng)態(tài)的調(diào)整qps來保證服務(wù)的穩(wěn)定。
3. sdk整體的架構(gòu)圖如下文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76112.html
摘要:我們是不是很好奇配置中心如何做到實(shí)時(shí)更新并且通知到客戶端的這也是一個(gè)面試中經(jīng)常會(huì)問到的題目。客戶端得到狀態(tài)碼是并且會(huì)根據(jù)立即去服務(wù)端拉取最新的配置。引言 記得我們那時(shí)候剛開始學(xué)習(xí)Java的時(shí)候都只是一個(gè)單體項(xiàng)目,項(xiàng)目里面的配置基本都是寫在項(xiàng)目里面的properties文件中,比如數(shù)據(jù)庫(kù)配置啥的,各種邏輯開關(guān),一旦這些配置修改了,還需要重啟項(xiàng)目這修改才會(huì)生效。隨著各種微服務(wù)的誕生,服務(wù)的...
摘要:我們是不是很好奇配置中心如何做到實(shí)時(shí)更新并且通知到客戶端的這也是一個(gè)面試中經(jīng)常會(huì)問到的題目。雖然是攜程開源的,但是攜程內(nèi)部也不用它??蛻舳说玫綘顟B(tài)碼是并且會(huì)根據(jù)立即去服務(wù)端拉取最新的配置。通過定時(shí)任務(wù)的補(bǔ)充,可以讓配置達(dá)到最終的一致性。 引言記得我們那時(shí)候剛開始學(xué)習(xí)Java的時(shí)候都只是一個(gè)單體項(xiàng)目,項(xiàng)目里面的配...
摘要:上篇文章緩存機(jī)制介紹了的緩存機(jī)制,相信大家對(duì)有了進(jìn)一步的了解,本文將詳細(xì)介紹網(wǎng)關(guān)如何實(shí)現(xiàn)服務(wù)下線的實(shí)時(shí)感知。目前網(wǎng)關(guān)實(shí)現(xiàn)的是對(duì)網(wǎng)關(guān)下游服務(wù)的實(shí)時(shí)感知,而且需滿足以下條件生產(chǎn)者需部署在容器管理平臺(tái)生產(chǎn)者做正常的下線升級(jí)或者縮容操作。 上篇文章《Eureka 緩存機(jī)制》介紹了Eureka的緩存機(jī)制,相信大家對(duì)Eureka 有了進(jìn)一步的了解,本文將詳細(xì)介紹API網(wǎng)關(guān)如何實(shí)現(xiàn)服務(wù)下線的實(shí)時(shí)感知...
閱讀 2351·2021-11-24 10:27
閱讀 3593·2019-08-30 15:55
閱讀 3355·2019-08-30 15:53
閱讀 2355·2019-08-29 17:27
閱讀 1445·2019-08-26 13:47
閱讀 3558·2019-08-26 10:28
閱讀 927·2019-08-23 15:59
閱讀 2871·2019-08-23 15:19