负责接收各agent对某modid、cmdid的请求并返回该modid、cmdid下的所有节点,即为agent提供获取路由服务
17.1 架构
17.2 网络模块
DnsService服务模型采用了one loop per thread TCP服务器,主要是基于Lars-Reactor:
- 主线程Accepter负责接收连接(agent端连接)
- Thread loop们负责处理连接的请求、回复;(agent端发送查询请求,期望获取结果)
17.3 双map模型
DnsServer使用两个map存储路由数据(key = `modid<<32 + cmdid` , value = set of `ip<<32 + port`)
- 一个
RouterDataMap_A:主数据,查询请求在此map执行 - 另一个
RouterDataMap_B:后台线程周期性重加载路由到此map,作为最新数据替换掉上一个map
这两个map分别由指针data_pointer与temp_pointer指向.
17.4 Backend Thread守护线程
dns service还有个业务线程:
1、负责周期性(default:1s)检查RouteVersion表版本号,如有变化,说明RouteData有变更,则重加载RouteData表内容;然后将RouteChange表中被变更的modid取出,根据订阅列表查出modid被哪些连接订阅后,向所有工作线程发送任务:要求订阅这些modid的连接推送modid路由到agent
2、此外,还负责周期性(default:8s)重加载RouteData表内容
PS:重加载**RouteData**表内容的细节
重加载RouteData表内容到temp_pointer指向的RouterDataMap_B,而后上写锁,交换指针data_pointer与temp_pointer的地址,于是完成了路由数据更新
主业务
- 服务启动时,
RouteData表被加载到data_pointer指向的RouterDataMap_A中,temp_pointer指向的RouterDataMap_B为空 - 服务启动后,agent发来Query for 请求某
modid/cmdid,到其所在Thread Loop上,上读锁查询data_pointer指向的RouterDataMap_A,返回查询结果; - 如果此
modid/cmdid不存在,则把agent ip+port+moid/cmdid发送到Backend thread loop1的队列,让其记录到ClientMap
后台线程Backend thread每隔10s清空temp_pointer指向的RouterDataMap_B,再加载RouteData表内容到temp_pointer指向的RouterDataMap_B,加载成功后交换指针data_pointer与temp_pointer指针内容,于是完成了路由数据的更新.
