服务器通讯概要设计.doc
?
?
?
?
?
RCU-U产品/项目
服务器通讯概要设计方案
?
指导RCU-U服务器通讯设计。
RCU-U 服务器端通讯软件编写人员
缩略语/术语
全? 称
说? 明
?
Conn server
RCU-U登陆验证服务器,并管理一定数量的logic server
?
Logic server
与RCU-U保持长连接的业务数据通讯的服务器
DNS
Domain Name System
域名服务器解析,域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器。
?
DNS 轮询均衡
大多域名注册商都支持多条A记录的解析,其实这就是DNS轮询,DNS服务器将解析请求按照A记录的顺序,逐一分配到不同的IP上,这样就完成了简单的负载均衡。?
?
A记录
A (Address) 记录是用来指定主机名(或域名)对应的IP地址记录。
?
?
??????????????????????? 服务器通讯总架构图
?
从服务器总框架图,我们可以得出以下数据流程图,关于服务器总框架图,请参考《服务器通讯技术方案》的介绍。
从终端通过GPRS传送
过来的登陆数据
接收数据并解析数据包
解析业务数据出错丢掉
解析业务数据数据
RCU-U 终端
否-断开通讯
服务器验证登陆数据
否-断开通讯
心跳数据检测
大数据库平台
保存
读取
是
以上是通讯数据流程图
?
对上图的通讯数据流程图具体说明如下:
1.?????? RCU-U设备通过访问域名,得到域名服务器的返回信息中获得域名服务器提供的IP(相当于ping baidu.com,然后返回一个IP给访问者),这里暂且称之为域名IP。此时默认端口是80
2.?????? RCU-U对域名IP发登陆数据包(此时暂定通讯端口为10000)
3.?????? 域名IP侦听10000端口上的连接,当有连接来时,它访问均衡服务器得到一个conn server IP, 并把RCU-U登陆数据包转发给该conn server进行登陆信息有效验证。验证成功,则
返回数据里包含一个可提供长连接通讯的logic server IP.
4.?????? conn server 把验证结果发给域名IP,域名IP把验证结果转发给RCU-U 设备,验证结果成功状态下,会获得一个logic server IP, 这时RCU-U 得到该logic server IP后,断开以前的登陆验证短连接,重新连接logic server IP才可真正直接跟它业务数据长连接通讯。
(这里为防攻击,在logic server IP上保存被登陆验证过的RCU IP 信息,只有当来连接logic server IP的 RCU IP在其上有验证记录才可连接上,这样可防止其它用户直接来连接logic server IP进行通讯)
?
每一路与logic server长连接通讯的TCP,都有一定间隔时间的心跳数据包来检测其通讯状况,如果固定接收频率时间段没收到心跳包,则可判断其通讯已经断开,这时服务端可断开其服务信息。相应地RCU-U 也要有从服务端检测到心跳包的机制,如果相应时间频率段没检测到来自服务器的心跳包,可判定已经与服务器断开,并需要再次重新连接。
?
通过GPRS传输的数据流都是根据业务层私有定义的协议进行数据封装的,所以这数据包放松出去前要封装,接收方要相应进行解包出数据并进行判段,分析要执行的相应业务层功能。
?
?
从数据流程图,我们已经知道数据的通讯协议,通讯方法和通讯流向。现再划分下服务器通讯TCP/IP系统各个模块。将更加详细地把大系统任务分解,并分成各个子系统(这里的子系统也即各个模块)
以下即是各个模块的描述图,及其之间的交互。
?
数据包解包打包模块
?
服务器通讯TCP/IP系统
内存管理模块
数据模块,利用数据库接口存储/读取
多线程管理模块
日志记录模块
DNS域名服务器模块
均衡服务器分配Conn Server和实时统计Conn Server的状态信息模块
Logic Server业务数据通讯模块
发送数据包打包器模块(根据协议)
RCU-U设备数据收发
接收数据包解包器模块
(根据协议)
Conn Server验证RCU登陆、统计它下面的Logic Server状态信息、分配Logic Server模块
?
??????????????????? 以上图是通讯服务器包含模块及交互流程图
?
对上图文字各个模块说明及之间交互说明,服务器通讯TCP/IP系统,包含如下系列模块。
?
1. 内存管理模块
?
为了更好的利用系统资源,不频繁操作内存的申请释放带来的操作而影响效率,这里的管理也是要事先根据我们的系统和业务分配好合理的内存大小空间,然后通过读写缓冲区的管理来达到。
?
2.数据库模块,利用数据库接口存储/读取
?
把解包的业务数据保存到对应RCU-U设备用户名的大数据平台里,读取大数据库中心数据主要是为了验证设备的用户信息是否有效。这里有一个合理的数据链表(让所有RCU-U设备的处理后的业务数据记录都存到这链表来,因此这表操作要有锁机制,同时一个操作),保存一条一条通讯业务数据记录(尽量用事先申请好的固定内存空间,以免频繁申请内存消耗资源),当链表记录条数达到指定上限时,通知保存到大数据库线程,让它一次性把多条数据记录批量写入数据库中心,而不是来一条记录写一条,减少数据库写频繁操作以提高效率(通常大数据库也是批量写入比单条记录写入高效)。这里写数据库线程应该有同步机制(带锁或者信号通知),如果没写完,下一次写先等待。写数据库线程应该设置超时机制,不可能一直阻塞在写数据库中,而让下一次写长时间等待。这里的超时机制其实也是类似丢数据机制,目的是为了让整个数据流过程通畅而不是在某一环阻塞而影响整个环节。
?
3. 多线程管理模块
使用线程池来管理线程,池的上限是服务器能接受的合理的线程数,启动系统时初始化这些线程。最大连接数根据线程数和一个线程处理单个RCU-U 的业务频率来确定,大于就拒绝服务。
每个线程使用队列的形式并配合aio或者nio来异步处理多个RCU-U的业务数据,并用事件通知来响应每个业务的实际处理情况,并用同样的方式存入数据库。
每个线程都维护一个事件循环,每个rcu数据的接受业务都会用事件循环来管理;,,,
?
?
?
一个线程可处理多个RCU-U设备端的TCP通讯业务,基于网络事件通知来对应处理属于终端的不同IP的业务数据,并保存至数据库。
?
这里再加上一个线程池,设置一个上限也就是我们的服务器能接受的合理的线程数,系统开始运行时初始化这些线程,并让他们先处在待工作状态(也即睡眠状态)。在单台logic server上当来连接的RCU-U数目越来越多,端口的系统通知的网络接受读写事件增多,这时候需要相应地唤醒多的线程来处理网络事件。直至整个线程池所有的线程都在工作状态。
?
当然,相应也要设置最大连接数,根据我们设置的线程数,及一个线程处理单个RCU-U 的业务频率,来确定一个合理的最大连接数,大于它既超过logic server 的最大压力而拒绝服务。其实,在conn server 这层早判断好了,如果它管理下的logic server 某台已经达到最大服务上限,conn server将不再分配连接过来的RCU-U 给它。
?
每个线程最多有一个EventLoop(事件循环),每个TcpConnection必须归某个EventLoop管理,所有的IO会转移到这个线程。换句话说,一个file descriptor 只能由一个线程读写。TcpConnection所在的线程由其所属的EventLoop决定,这样我们可以很方便地把不同的TCP连接放到不同的线程去,也可以把一些TCP连接放到一个线程里。TcpConnection和EventLoop是线程安全的,可以跨线程调用。
?
Non-blocking IO 的核心思想是避免阻塞在 read() 或 write() 或其他 IO 系统调用上,这样可以最大限度地复用 thread-of-control,让一个线程能服务于多个 socket 连接。IO 线程只能阻塞在 IO-multiplexing 函数上
?
?
4. 日志记录模块
?
对各个模块可抛出来的错误进行记录,事先把出错编号对应描述字符串都定义到一个头文件里(如logmsg.h里定义好出错码下的描述字符串),便于以后增加和修改。写记录可以文件日期命名(如2013-09-01.log),这样可只需要记录当天异常信息到当日日志,方便以后日志查询。可以一条出错信息一行,以后可把日志写一个统计工具,方便统计各类型出错的频率,以方便后面软件的bug查找。这里由于是一个当天的文件日志多个模块对其同时进行写操作,需要有一次只能有一个写的机制(带锁)。
?
5.?????? DNS域名服务器模块
?
通常是一个DNS域名解析一个公网IP,但是现实中你会看到www.baidu.com,www.yahoo.cn会在不同时段访问解析出的IP不一样,这是利用了DNS轮询解析机制,目的是用来缓解都影射到一台服务器公网IP的压力。
我们在解析IP时。如果RCU-U 设备路数增多到映射域名到单台服务器IP处理不过来时,要切换影射到其他公网IP去。它解析完后,再连接均衡服务器,均衡服务器会主动分配一个它知道的压力较小的Conn server IP ,并转发RCU-U 发过来的登陆数据给Conn server ,如果登陆验证失败,则断开通讯。登陆成功。再往下分配一个logic server IP 与RCU-U 长连接业务数据通讯。
?
6.? 均衡服务器分配Conn Server和实时统计Conn Server的状态信息模块
?
均衡服务器实时统计Conn Server的状态信息,它可以设立定时扫描机制,对所有的conn server 状态信息进行及时更新。当有新的RCU-U 终端设备连接时(通过均衡服务器转发过来的用户登陆数据),它从当前的Conn Server 队列里,按顺序找往下找,找一个还没达到服务器上限的Conn Server。如果一直往Conn Server 队列找,都是服务器满,说明整个服务器空间已经达到上限,只能拒绝这次的连接请求。
??? 当分配到conn server 后,该台服务器会从数据库里读取该设备用户的账户密码信息,如果验证对,则往下分配一个logic server 给RCU-U 设备进行长连接TCP通讯。
?
7. Conn Server验证RCU登陆、统计它下面的Logic Server状态信息、分配Logic Server模块
?
当Conn Server接收到RCU的登陆数据包后,需要从数据库里对该用户信息进行验证,如果成功需要返回一台未满服务的logic server为其提供通讯服务。
?
类似均衡服务器实时统计Conn Server的状态信息,它可以设立定时扫描机制,对所有的Logic Server状态信息进行及时更新。这里预估一台logic server 可服务Max_limit=10000台左右RCU设备,数据可参考《服务器通讯技术方案》,假设一台conn server 管理下面10台logic server,当其中一台超过Max_limit连接数,则该台不能再分配给RCU设备服务。如果我们的10台logic server都达到Max_limit,则这时,conn server 应对给外界标识为服务满状态。如果有一台没达到Max_limit,都可以分配给RCU提供服务。
?
8. Logic Server业务数据通讯模块
?需要对业务数据根据自定义通讯协议命令解析出数据,这里根据业务数据如诊断数据,GPS数据,油耗,陀螺仪等数据一系列地解析到相应结构体数据中(如datastrcut.h里定义好所有数据包里需要解析出来的结构体数据)
?
9. 数据包解包打包模块
这里RCU-U的采集数据打包后通过TCP socket 进行传输,然后在logic server上进行数据包解包:即把缓冲区收到的字符,相应地转到数据结构体,并再按照一条条记录保存到数据库里。其中拆包过程会先解析到长度参数,后解析到相应长度数据到结构体,这样完整地解出网络数据包中的真实数据。
5.1重用资产的引用及获取位置
?
5.2重用资产的输出及存放位置
列出本文档参考的文献和相关文档。
?