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