美文网首页
(18)Lars-dns简介(Dns部分)-【Lars-基于C+

(18)Lars-dns简介(Dns部分)-【Lars-基于C+

作者: 刘丹冰Aceld | 来源:发表于2019-10-09 09:20 被阅读0次

    【Lars教程目录】

    Lars源代码
    https://github.com/aceld/Lars


    【Lars系统概述】
    第1章-概述
    第2章-项目目录构建


    【Lars系统之Reactor模型服务器框架模块】
    第1章-项目结构与V0.1雏形
    第2章-内存管理与Buffer封装
    第3章-事件触发EventLoop
    第4章-链接与消息封装
    第5章-Client客户端模型
    第6章-连接管理及限制
    第7章-消息业务路由分发机制
    第8章-链接创建/销毁Hook机制
    第9章-消息任务队列与线程池
    第10章-配置文件读写功能
    第11章-udp服务与客户端
    第12章-数据传输协议protocol buffer
    第13章-QPS性能测试
    第14章-异步消息任务机制
    第15章-链接属性设置功能


    【Lars系统之DNSService模块】
    第1章-Lars-dns简介
    第2章-数据库创建
    第3章-项目目录结构及环境构建
    第4章-Route结构的定义
    第5章-获取Route信息
    第6章-Route订阅模式
    第7章-Backend Thread实时监控


    【Lars系统之Report Service模块】
    第1章-项目概述-数据表及proto3协议定义
    第2章-获取report上报数据
    第3章-存储线程池及消息队列


    【Lars系统之LoadBalance Agent模块】
    第1章-项目概述及构建
    第2章-主模块业务结构搭建
    第3章-Report与Dns Client设计与实现
    第4章-负载均衡模块基础设计
    第5章-负载均衡获取Host主机信息API
    第6章-负载均衡上报Host主机信息API
    第7章-过期窗口清理与过载超时(V0.5)
    第8章-定期拉取最新路由信息(V0.6)
    第9章-负载均衡获取Route信息API(0.7)
    第10章-API初始化接口(V0.8)
    第11章-Lars Agent性能测试工具
    第12章- Lars启动工具脚本


    四、Lars-DNS Service开发

    1) 简介

    负责接收各agent对某modid、cmdid的请求并返回该modid、cmdid下的所有节点,即为agent提供获取路由服务

    1.1 架构

    3-Lars-dnsserver.png

    1.2 网络模块

    ​ DnsService服务模型采用了one loop per thread TCP服务器,主要是基于Lars-Reactor:

    • 主线程Accepter负责接收连接(agent端连接)
    • Thread loop们负责处理连接的请求、回复;(agent端发送查询请求,期望获取结果)

    1.3 双map模型

    ​ DnsServer使用两个map存储路由数据(key = modid<<32 + cmdid , value = set of ip<<32 + port

    • 一个RouterDataMap_A:主数据,查询请求在此map执行
    • 另一个RouterDataMap_B:后台线程周期性重加载路由到此map,作为最新数据替换掉上一个map

    这两个map分别由指针data_pointertemp_pointer指向.

    1.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_pointertemp_pointer的地址,于是完成了路由数据更新

    主业务

    1. 服务启动时,RouteData表被加载到data_pointer指向的RouterDataMap_A中, temp_pointer指向的RouterDataMap_B为空

    2. 服务启动后,agent发来Query for 请求某modid/cmdid,到其所在Thread Loop上,上读锁查询data_pointer指向的RouterDataMap_A,返回查询结果;

    3. 如果此modid/cmdid不存在,则把agent ip+port+moid/cmdid发送到Backend thread loop1的队列,让其记录到ClientMap

    后台线程Backend thread每隔10s清空temp_pointer指向的RouterDataMap_B,再加载RouteData表内容到temp_pointer指向的RouterDataMap_B,加载成功后交换指针data_pointertemp_pointer指针内容,于是完成了路由数据的更新.


    关于作者:

    作者:Aceld(刘丹冰)

    mail: danbing.at@gmail.com
    github: https://github.com/aceld
    原创书籍gitbook: http://legacy.gitbook.com/@aceld

    原创声明:未经作者允许请勿转载, 如果转载请注明出处

    相关文章

      网友评论

          本文标题:(18)Lars-dns简介(Dns部分)-【Lars-基于C+

          本文链接:https://www.haomeiwen.com/subject/unkipctx.html