使用C++实现, 运行在Linux下, 依赖mysqlclient库, 消息的编解码使用protobuf。
客户端与服务器的通信采用TCP长连接。 服务器采用多线程异步模型,主线程接收新连接,
子线程通过事件循环处理网络IO。新建TcpConnection时从event loop pool里挑选一个
loop给TcpConnection用
使用LVS+Keepalived实现负载均衡, LVS的转发采用直接路由模式。
负载均衡层由两个Director组成,一个master和一个backup。
服务器集群部署两个chat服务器,提供即时通讯的基本功能
数据共享存储层通过mysql和redis存储用户信息、缓存消息记录。
cd ./chat/excercise/chatServer<br>
make
./server_threaded [port] [thread_nums] #启动服务器 port:服务器端口 thread_nums:线程池大小<br>
chatClient 需要在本地存储用户信息,user.info中的用户信息在用户首次注册时生成。<br>
./chatClient [server_addr] [server_port] # server_addr —— 服务器地址 server_port —— 服务器端口
//注册用户
s [user_name] [passwd]
//登录
l [user_id] [passwd] # user_id 由服务器返回,并append到user.info
//私聊
p [peer_id] [message...] # peer_id 好的账号, message表示消息
//创建聊天群
c [group_id] # group_id 用户向服务器注册群号,任意用户都可以创建聊天群
//加入聊天群
g [group_id] # group_id 群号,任意人都可以加入某一个群,没有权限限制
//退出聊天
q
- 客户端:
1)登录部分测试:
--------------------------------------------------
输入示例 预计输出
--------------------------------------------------
id不存在 uid:foo 客户端收到错误提示信息
passwd:123
--------------------------------------------------
id存在 uid:bar 客户端收到错误提示信息
密码不正确 passwd:1234
--------------------------------------------------
id不存在 uid:panda 客户端收到提示信息
密码正确 passwd:2427
--------------------------------------------------
id正确 uid:frog 进入聊天
密码正确 passwd:1357
--------------------------------------------------
2)注册模块测试:
--------------------------------------------------
输入示例 预计输出
--------------------------------------------------
注册已经存在 id:foo 提示用户已经存在
的id
--------------------------------------------------
两次密码输 passwd:123 提示密码错误
入不一致 passwd:321
--------------------------------------------------
有未填写项 id空白或 提示有未输入项
passwd空白
--------------------------------------------------
- 服务端:
1)注册模块测试:
./sign_up localhost port 注册4万个用户,用户信息持久化到mysql用时15s. 用户名是"abcdefgh"的全排列。
2) 登录模块测试:
bug1:客户端退出程序前没有主动断开连接,此时服务端还认为用户在线,并且会导致下次用户登录不上系统。
3)压力测试:
服务器为4核i7-4790k @ 4GHz服务器
1000个用户连接,每个用户随机挑选其他用户发"hello world!",测试持续24小时,服务器未出现问题。
一个用户向另外一个用户发送20万条"hello world", 时间消耗平均是6s, 服务器TPS达到3万/秒。
