概念
註冊表存儲結構 CocurrentHashMap
部署數量
訪問壓力 日均千萬級別
心跳機制 Client發送心跳Server,30s/次,拉取註冊表信息-是否變化
[1]Client 向Server,註冊服務信息
[2]Server
[3]Client 向Server,拉取註冊表
[4]Client 向Server,註冊服務信息【後續部署註冊】
[5]Server 向Client,請求註冊表信息變化,30s/次
[6]Client 更新註冊表
[7]Client 向Server,發送心跳,30s/次
優勢特點
[1]解決讀寫衝突
[2]提升請求性能
註冊表
存儲位置 純內存
存儲結構 CocurrentHashMap
Key 服務名稱 inventory-service
Value 服務實例 Map<String,Lease<InstanceInfo>>
[1]InstanceInfo 實例信息 IP、Portn、Hostname
[2]Lease 發佈實體 維護服務最近一次發送心跳時間
數據結構
[1]Memory 內存註冊表
[2]ReadWriteCacheMap 讀寫緩存註冊表
[3]ReadOnlyCacheMap 只讀緩存註冊表
優先位置
[1]Client-Provider Memory、ReadWriteCacheMap、ReadOnlyCacheMap
[2]Client-Consumer ReadOnlyCacheMap、ReadWriteCacheMap、Memory
內存處理
[1]維護註冊表
[2]拉取註冊表
[3]更新心跳時間
實例:主機 = 1 : 1
多級緩存機制
背景 解決併發衝突 [讀寫內存數據結構造成]
目的 提升響應速度
拉取註冊表
[1]ReadOnlyCacheMap 首先,查詢只讀緩存的註冊表
[2]ReadWriteCacheMap 若無,查詢讀寫緩存的註冊表
[3]Memory內存 若無,查詢實際內存的註冊表
註冊表變化
[1]Memory 變更,內存的註冊表
[2]ReadWriteCacheMap 過期,讀寫緩存的註冊表
[3]ReadOnlyCacheMap 不會影響,提供只讀緩存的註冊表
[4]首個30s 服務拉取註冊表,直接讀取ReadOnlyCacheMap
[5]次個30s EurekaServer,判斷已經清空ReadWriteCacheMap,清空ReadOnlyCacheMap
[6]最後 下次服務拉取註冊表,重新從Memory內存獲取數據,填充緩存ReadOnlyCacheMap、ReadWriteCacheMap
原理
背景 同一個服務,新增部署主機
Step1 Client,發起註冊
Step2 Server,依次填充註冊表: ReadWriteCacheMap,ReadOnlyCacheMap
Step3 Client,拉取註冊表,依次查詢:ReadOnlyCacheMap,若無ReadWriteCacheMap,若無Memory
Step4 Client,部署新的主機,再次註冊
Step5 Server,Memory內存註冊表改變,同時過期ReadWriteVachemap
Step6 Client,30秒,拉取註冊表,ReadOnlyCacheMap。 【可能通信舊的主機】
Step7 Server,30秒,後臺線程自動同步新的ReadOnlyCacheMap、ReadWriteCacheMap,過期舊的ReadOnlyCacheMap
Step8 Client,再次拉取,依次查詢:ReadOnlyCacheMap[過期],若無ReadWriteCacheMap[過期],若無Memory
案例
分佈式系統
[1]服務數量 100個
[2]部署主機 服務:主機 = 1:20
[3]主機配置 核心:4個
內存:8G
計算
服務實例 100 * 20 = 2000 個
拉取註冊表次數 2次/min
心跳請求次數 2次/min
每個服務請求次數 4次/min * 2000 = 8000次/( min * 個 )
8000 / 60 = 133 次/( s * 個 )
8000 * 60 * 24 = 11520000 次 / ( day * 個) 【每天千萬級訪問量】