【Lars教程目錄】
Lars源代碼
https://github.com/aceld/Lars
【Lars系統(tǒng)概述】
第1章-概述
第2章-項目目錄構(gòu)建
【Lars系統(tǒng)之Reactor模型服務(wù)器框架模塊】
第1章-項目結(jié)構(gòu)與V0.1雛形
第2章-內(nèi)存管理與Buffer封裝
第3章-事件觸發(fā)EventLoop
第4章-鏈接與消息封裝
第5章-Client客戶端模型
第6章-連接管理及限制
第7章-消息業(yè)務(wù)路由分發(fā)機(jī)制
第8章-鏈接創(chuàng)建/銷毀Hook機(jī)制
第9章-消息任務(wù)隊列與線程池
第10章-配置文件讀寫功能
第11章-udp服務(wù)與客戶端
第12章-數(shù)據(jù)傳輸協(xié)議protocol buffer
第13章-QPS性能測試
第14章-異步消息任務(wù)機(jī)制
第15章-鏈接屬性設(shè)置功能
【Lars系統(tǒng)之DNSService模塊】
第1章-Lars-dns簡介
第2章-數(shù)據(jù)庫創(chuàng)建
第3章-項目目錄結(jié)構(gòu)及環(huán)境構(gòu)建
第4章-Route結(jié)構(gòu)的定義
第5章-獲取Route信息
第6章-Route訂閱模式
第7章-Backend Thread實時監(jiān)控
【Lars系統(tǒng)之Report Service模塊】
第1章-項目概述-數(shù)據(jù)表及proto3協(xié)議定義
第2章-獲取report上報數(shù)據(jù)
第3章-存儲線程池及消息隊列
【Lars系統(tǒng)之LoadBalance Agent模塊】
第1章-項目概述及構(gòu)建
第2章-主模塊業(yè)務(wù)結(jié)構(gòu)搭建
第3章-Report與Dns Client設(shè)計與實現(xiàn)
第4章-負(fù)載均衡模塊基礎(chǔ)設(shè)計
第5章-負(fù)載均衡獲取Host主機(jī)信息API
第6章-負(fù)載均衡上報Host主機(jī)信息API
第7章-過期窗口清理與過載超時(V0.5)
第8章-定期拉取最新路由信息(V0.6)
第9章-負(fù)載均衡獲取Route信息API(0.7)
第10章-API初始化接口(V0.8)
第11章-Lars Agent性能測試工具
第12章- Lars啟動工具腳本
四蜡感、Lars-DNS Service開發(fā)
1) 簡介
負(fù)責(zé)接收各agent對某modid萧求、cmdid的請求并返回該modid己莺、cmdid下的所有節(jié)點细诸,即為agent提供獲取路由服務(wù)
1.1 架構(gòu)
1.2 網(wǎng)絡(luò)模塊
? DnsService服務(wù)模型采用了one loop per thread TCP服務(wù)器届榄,主要是基于Lars-Reactor:
- 主線程Accepter負(fù)責(zé)接收連接(agent端連接)
- Thread loop們負(fù)責(zé)處理連接的請求痊末、回復(fù)刊懈;(agent端發(fā)送查詢請求歌溉,期望獲取結(jié)果)
1.3 雙map模型
? DnsServer使用兩個map存儲路由數(shù)據(jù)(key = modid<<32 + cmdid
, value = set of ip<<32 + port
)
- 一個
RouterDataMap_A
:主數(shù)據(jù)瓶颠,查詢請求在此map執(zhí)行 - 另一個
RouterDataMap_B
:后臺線程周期性重加載路由到此map拟赊,作為最新數(shù)據(jù)替換掉上一個map
這兩個map分別由指針data_pointer
與temp_pointer
指向.
1.4 Backend Thread守護(hù)線程
dns service還有個業(yè)務(wù)線程:
1、負(fù)責(zé)周期性(default:1s)檢查RouteVersion
表版本號粹淋,如有變化吸祟,說明RouteData
有變更瑟慈,則重加載RouteData
表內(nèi)容;然后將RouteChange
表中被變更的modid
取出屋匕,根據(jù)訂閱列表查出modid
被哪些連接訂閱后葛碧,向所有工作線程發(fā)送任務(wù):要求訂閱這些modid
的連接推送modid
路由到agent
2、此外过吻,還負(fù)責(zé)周期性(default:8s)重加載RouteData
表內(nèi)容
PS:重加載RouteData
表內(nèi)容的細(xì)節(jié)
重加載RouteData
表內(nèi)容到temp_pointer
指向的RouterDataMap_B
进泼,而后上寫鎖,交換指針data_pointer
與temp_pointer
的地址纤虽,于是完成了路由數(shù)據(jù)更新
主業(yè)務(wù)
服務(wù)啟動時乳绕,
RouteData
表被加載到data_pointer
指向的RouterDataMap_A
中,temp_pointer
指向的RouterDataMap_B
為空服務(wù)啟動后,agent發(fā)來Query for 請求某
modid/cmdid
逼纸,到其所在Thread Loop上洋措,上讀鎖查詢data_pointer
指向的RouterDataMap_A
,返回查詢結(jié)果杰刽;如果此
modid/cmdid
不存在菠发,則把agent ip+port
+moid/cmdid
發(fā)送到Backend thread loop1的隊列,讓其記錄到ClientMap
后臺線程Backend thread每隔10s清空temp_pointer
指向的RouterDataMap_B
贺嫂,再加載RouteData
表內(nèi)容到temp_pointer
指向的RouterDataMap_B
雷酪,加載成功后交換指針data_pointer
與temp_pointer
指針內(nèi)容,于是完成了路由數(shù)據(jù)的更新.
關(guān)于作者:
作者:Aceld(劉丹冰)
mail: danbing.at@gmail.com
github: https://github.com/aceld
原創(chuàng)書籍gitbook: http://legacy.gitbook.com/@aceld
原創(chuàng)聲明:未經(jīng)作者允許請勿轉(zhuǎn)載, 如果轉(zhuǎn)載請注明出處