TCP服务器和客户端采用C++编写,通过TCP协议与服务器连接并由SSL安全传输层保证安全,实现即时通信。浏览器端通过HTML5中提出的Websocket协议与服务器连接,Websocket服务器和HTTP服务器采用Nodejs编写。不同物理服务器,不同语言服务器采用统一的数据传输格式来传输,借助redis数据库的Pub/Sub模式和消息队列,来进行服务器之间的信息通信。对数据库进行Master/Salve备份。
为了提高对数据的处理,采用缓存数据库Redis。Redis是一个Key-Value数据库,数据库设计主要体现在Key的设计。存储的数据是二进制安全的。
user:001 | info |
---|---|
useId | 用户ID |
usename | 用户名 |
password | 密码 |
imageUrl | 头像 |
邮箱 | |
lastLoginTime | 最近登陆时间 |
nickname | 昵称 |
group:001 | info |
---|---|
groupId | 群号 |
groupName | 群名称 |
imageUrl | 群头像 |
logined:14006 | info |
---|---|
address | 消息服务器地址 |
port | 消息服务器端口 |
sessionid | 密钥种子 |
Key类型 | value info | exmaple |
---|---|---|
集合groupSet:(userid) | 存储用户加入的群号 | 如groupSet:14006 |
集合friendsSet:(userid) | 存储好友ID | 如friendsSet:14006 |
列表unreadMsg:(userid) | 存储用户二进制点对点未读消息 | 如unreadMsg:14006 |
键online:(userid) | 存储用户在线的服务器Socket信息。 | 如online:14006 |
哈希表group:(group) | 存储群信息 | 如group:1 |
列表groupMsg:(groupid) | 存储二进制群消息 | 如groupMsg:1 |
列表groupMember:(groupid) | 存储群成员ID | 如:groupMember:1。 |
列表onlineGroup:(groupid) | 存储当前在线群成员ID。 | 如:onlineGroup:1。 |
键unreadNumber:(userid):(groupid) | 存储未读群消息数目。 | 如:unreadMember:14006:1。 |
哈希表loginMap:(userid) | 存储用户登陆密钥和消息服务器信息。 | 如:loginMap:14006。 |
有序集合serverRank存储消息服务器套接字信息及排名。
Tcp_Server
:服务器网络连接类。采用Boost .Asio作为异步模型,实现高性能网络服务器。监听端口、接收新的连接,对每个连接创建新的Tcp_Session对象。Tcp_Session
:网络连接Session类。接收、发送TCP流,PING数据包,错误处理,消息接收到后交付ProtubufCodec处理[22]。Ssl_Server
:安全传输层TLS/SSL服务器网络连接类。Ssl_Session
:安全传输层TLS/SSL连接Session类。Connection_Manager
:网络连接管理类。管理连接用户ID与连接的映射关系,创建、退出时要处理的相关数据。MyBuffer:
数据缓存区类。ProtubufCodec
:网络消息封包和拆包及加密解密类。ProtubufDispatcher
:处理函数和不同消息类型之间映射类。Credis
:与redis数据库操作类,像管道,多操作原子性等复杂操作通过返回redisContext来处理。