赞
踩
本文转载自:http://blog.csdn.net/hailong0715/article/details/53418594
特根据理解绘制业务图如下:
线程图:
DB_PROXY_Server数据库代理是TeamTalk TTServer中负责与数据库交互的代理服务器,在DB server中负责承载TeamTalk所有业务层面和逻辑层面的数据入库和持久化等服务,是TT_Server中比较重要的一环,在设计中采用了很多实用的技术,比如池化技术,数据库代理,单例模式等,收益匪浅,下面对TealTalk的DB_Server作个详细分析,以封面是自己阅读代码后的学习总结,一方面可以给其他学习TT_Server的人提供参考。
可以通过查看DB_Server的配置文件dbproxyserver.conf文件,DB_SERVER主要分为以下几个部分:
1、TeamTalk_Matser 采用了MySQL数据库
2、TeamTalk_Slave MYSQL数据库
3、unread 未读信息实例 Redis 数据库
4、group_set 群组设置实例 redis数据库
5、token 实例 redis数据库
6、sync实例 redis数据库 同步功能
7、group_member redis 数据库
每个数据库实例都会预先打开于数据库的两个链接,不需要在每次使用的时候再打开,使用结束后释放,节省了数据打开和释放需要的时间和资源,在当前可用连接数不够的情况下再新增一个数据库链接,动态调节DB_Server的负载,同时限定了每个实例的最大可用连接数,由于系统资源是有限的,当业务比较繁忙时不能无限制创建新的连接,避免耗尽系统资源,这种场景下,当没有可用连接的时候,新的业务请求必须等待,等待可用的连接,然后再执行相应的业务操作。
DB_Server采用了多线程,在DB_Server启动的时候预先分配了配置文件中指定的线程数,用来处理具体的数据库请求,当一个请求到达DB_Server时,DB_Server将该请求封装成DB相关的额任务类,然后随机加入到预先启动的线程的任务列表中,有线程回调函数不停执行具体的任务请求,者就是整个DB_Serve的设计思路。
下面来看代码的流程:
db_proxy_server的main函数中,依次从配置文件中读取各个实例的名称以及初始DB实例个数,最大连接数等信息。
首先获取CacheManager的对象,在获取对象的同时对该对象以及该对象管理的资源进行了初始化。
需要明确的是,cacheManager维护了一个map,map<string, CachePool*>m_cache_pool_map;这个map的key值就是每个配置文件中每个CacheInstances的名称,对应给每一个cache实例维护了一个连接池CachePool, 在CachePool中有维护了一个list<CacheConn*>m_free_list;,这个list保存了对应cache实例的连接,CacheConn是对每个DB连接的封装。这个类中维护了对应数据库连接的一些基本信息,redis数据的话保存的是数据库连接上下文redisContext,以及操作数据库的Set 和Get方法。
创建CacheManager的对象
CDBManager的初始化流程与CacheManager的初始化流程类似,唯一不同的是CDBManager保存的CDBConn是到MYSQL数据库的连接。其他过程类似,理解上面CacheManager的流程就很容易理解该部分流程,这里不再重复叙述了。
完成DB相关资源的对象初始化,这些类都用了单例模式,因此初始化这些对象都只需要调用自身的GetInstance方法,
这个部分可谓是db_proxy_server中重要的一环,所有的DB任务都是通过从工作线程池中的线程通过获取对应命令ID的回调函数来执行所有的数据库操作任务,因此理解了这部分差不多就理解了db_proxy_server的一半,下面介绍这部分流程。
g_thread_pool.Init(thread_num);这行代码根据传入的参数创建了指定数量的线程,每个工作线程中都维护了一个任务队列,在有数据请求来的时候,系统随机将任务添加到线程的任务队列中,线程一次执行自己任务队列中的任务。
在事件分发中需要详解的是从socket中读取客户请求数据并解析PDU数据包,处理客户请求,回复效应,其他socket连接等部分在之前的文章中已经叙述过了,这里就不再重复了,下面主要陈述db_proxy_server中处理客户请求的流程。
在db_proxy_server中接收到用户的请求数据后都会在如下的函数中解析请求数据。
至此db_proxy_server的整个初始化流程和处理流程都介绍完毕。在整个db server中核心思想就是池化技术,(DB连接池,工作线程池);整个核心流程是创建线程池,根据命令ID注册对应的处理回调,在线程回调函数中处理任务队列,依次取出任务,根据注册的回调处理任务请求,回响应。
鉴于本人理解有限,在行文的过程中可能存在一些理解或者描述错误的地方,请各位看官指正,TT_SERVER详解系列,是本人学习teamtalk源码的一些理解和心得,看源码主要看的是设计方法,处理思维,在不断学习中进步。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。