当我们遇到100亿次请求?该如何设计后端架构?
点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐]
作者:xiaojiaqi
github.com/xiaojiaqi/10billionhongbaos
00 前言
01 背景知识
QPS:Queries per second 每秒的请求数目 PPS:Packets per second 每秒数据包数目 摇红包:客户端发出一个摇红包的请求,如果系统有红包就会返回,用户获得红包 发红包:产生一个红包里面含有一定金额,红包指定数个用户,每个用户会收到红包信息,用户可以发送拆红包的请求,获取其中的部分金额。
02 确定目标
支持至少100万连接用户 每秒至少能处理2.3万的QPS,这里我们把目标定得更高一些 分别设定到了3万和6万。 摇红包:支持每秒83个的速度下发放红包,也就是说每秒有2.3万次摇红包的请求,其中83个请求能摇到红包,其余的2.29万次请求会知道自己没摇到。当然客户端在收到红包以后,也需要确保客户端和服务器两边的红包数目和红包内的金额要一致。因为没有支付模块,所以我们也把要求提高一倍,达到200个红包每秒的分发速度 支持用户之间发红包业务,确保收发两边的红包数目和红包内金额要一致。同样也设定200个红包每秒的分发速度为我们的目标。

03 基础软件和硬件


04 技术分析和实现
https://github.com/xiaojiaqi/C1000kPracticeGuide/tree/master/docs/cn
客户端QPS
服务器QPS
第一:需要记录每秒处理的请求数目,这需要在代码里埋入计数器。 第二:我们需要监控网络,因为网络的吞吐情况,可以客观的反映出QPS的真实数据。为此,我利用python脚本 结合ethtool 工具编写了一个简单的工具,通过它我们可以直观的监视到网络的数据包通过情况如何。它可以客观的显示出我们的网络有如此多的数据传输在发生。


05 代码实现及分析
客户端的摇红包请求消息 客户端的其他消息 比如聊天 好友这一类 服务器端对客户端消息的回应
06 实践
实践的过程分为3个阶段
Alias ss2=Ss –ant | grep 1025 | grep EST | awk –F: “{print \$8}” | sort | uniq –c’






07 分析数据

当非常多goroutine 同时运行的时候,依靠sleep 定时并不准确,发生了偏移。我觉得这是golang本身调度导致的。当然如果cpu比较强劲,这个现象会消失。 因为网络的影响,客户端在发起连接时,可能发生延迟,导致在前1秒没有完成连接。 服务器负载较大时,1000M网络已经出现了丢包现象,可以通过ifconfig 命令观察到这个现象,所以会有QPS的波动。





08 总结

单机百万的实践 https://github.com/xiaojiaqi/C1000kPracticeGuide 如何在AWS上进行100万用户压力测试 https://github.com/xiaojiaqi/fakewechat/wiki/Stress-Testing-in-the-Cloud 构建一个你自己的类微信系统 https://github.com/xiaojiaqi/fakewechat/wiki/Design http://djt.qq.com/article/view/1356 http://techblog.cloudperf.net/2016/05/2-million-packets-per-second-on-public.html http://datacratic.com/site/blog/1m-qps-nginx-and-ubuntu-1204-ec2 @火丁笔记 http://huoding.com/2013/10/30/296 https://gobyexample.com/non-blocking-channel-operations
觉得本文对你有帮助?请分享给更多人
关注「全栈开发者社区」加星标,提升全栈技能
本公众号会不定期给大家发福利,包括送书、学习资源等,敬请期待吧!
如果感觉推送内容不错,不妨右下角点个在看转发朋友圈或收藏,感谢支持。
好文章,留言、点赞、在看和分享一条龙吧❤️
评论