腾讯课堂停课不停学:业务后台实践-腾讯云开发者社区-天下网标王
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >腾讯课堂停课不停学:业务后台实践

腾讯课堂停课不停学:业务后台实践

原创
作者头像
王昂
修改2020-05-07 17:23:36
修改2020-05-07 17:23:36
2.6K1
举报
文章被收录于专栏:https://cloud.tencent.com/developer/article/1349133

优化效果:主db峰值链接数从4.6k下降到3.8k

阶段3:核心模块逐个专项击破

接入:血的教训

课堂支持学生在pc/web/app/ipad/h5/小程序等多端进行学习,接入模块属于基础组件改动不大,但这次web接入模块却出了2个问题,确实不应该:

接入层.png
接入层.png

针对这2个问题也做了专项总结:

  1. 校准压测用例,更模拟现网流量
  2. nginx动静分离,上报等接口也独立出去
  3. nginx规则精简,接入层尽量打薄,逻辑后移
  4. 统一机器net.core.somaxconn等参数配置,重点监控告警
  5. 压测完要清理战场,关注fd等指标是否恢复
  6. 升级tomcat规避挂死bug
  7. 升级tomcat遵循RFC3986规范,规避特殊字符影响 ......

直播:站在云的肩膀上

课堂最核心的模块就是音视频,直播的进房成功率/首帧延迟/卡顿率/音画同步时延/分辨率等指标直接影响用户核心体验。由于直播模块之前已全部切云,这次站在云的肩膀上,业务不仅直接使用了云的多种直播模式,云音视频团队在整个疫情期间也提供非常给力的质量保障。

下面是具体的直播架构,业务通过流控Svr来控制各端走哪种直播模式:

直播架构.png
直播架构.png

消息:走推走拉?

随着极速版普及,各学校对单房间同时在线人数要求也越来越高,从3w->6w->30w->150w。

对于大房间消息系统而言,核心要解决消息广播风暴的问题(30w人房间,有100人在同1秒发言,会产生30w*100=3kw/s消息),随着扩散因子的变大,之前纯推的方案已不能满足需求,参考了业内直播间的一些IM方案:

消息系统方案.png
消息系统方案.png

结合对比方案,也针对课堂产品特性,在原来纯推架构上新迭代一版推拉结合的架构

对于IM系统的设计,推荐一下这个文章:《新手入门一篇就够:从零开发移动端IM》

http://www.52im.net/thread-464-1-1.html

阶段4:做好核心路径的防过载和柔性降级

在非常有限的时间里,逻辑层根本来不及重构,容量评估也不一定精准,过载保护和柔性降级就显得尤其重要

因为没时间全盘优化,在量突然暴涨的情况下,某个模块过载或者爆bug的概率会变大,所以在用户登录->查课表->上课的核心路径上,必须增加足够容错能力来提高可用性

雪崩来得猝不及防

疫情初期课堂就遇到一个雪崩的case:直播间拉取成员列表接口有失败毛刺,因为web没做异常保护,失败直接把循环拉取间隔时间置0,导致接口调用量越滚越大,B侧拉取涨了10倍后雪崩超时。由于没预埋开关等控制策略,得回滚web版本才解决。

这个case暴露了过载保护的缺失,一方面web没对异常返回做合理处理保护后端,一方面svr没有识别雪崩请求做限频,除此之外,也缺少一些配置开关可快速控制web循环间隔时间,导致雪崩来得猝不及防

过载保护策略

针对这类badcase,对核心路径的服务做了很多过载保护和柔性降级策略,这里把一些典型方案记录下:

过载保护策略.png
过载保护策略.png

限流和熔断

高并发场景为了规避过载的级联传递,防止全链路崩溃,制定合理的限流和熔断策略是2个常见的解决方案。

以这次疫情互动直播限流场景为例,互动直播默认只部署最多支撑600w同时在线的接口机资源,如果哪天突发超过了600w学生:

直播限流.png
直播限流.png

限流算法选择上,最常见就是漏桶和令牌桶。不是说令牌桶就是最好的,只有最合适的,有时简单的计数器反而更简单。golang拓展库 golang.org/x/time/rate 就提供了令牌桶限流器,3个核心api:

代码语言:txt
复制
1、func (*Limiter) Allow: 没有取到token返回false,消耗1个token返回true
2、func (*Limiter) Wait: 阻塞等待,直到取到1个token
3、func (*Limiter) Reserve: 返回token信息,返回需要等待多久才有新的token

除了算法外,怎么把限流集成到框架、分布式限流实现、限流后请求优先级选择等问题,可以做得更深入,但很遗憾这次没时间搞,后面继续实践

熔断是另一个重要防过载策略,其中熔断器Hystrix最为著名,github.com/afex/hystrix-go 就提供了其golang版本实现,使用也简单。其实L5就包含了熔断能力,包括熔断请求数阈值、错误率阈值和自动恢复探测策略

Apollo配置中心

好的组件都是用脚投票,这次疫情期间,很多策略开关和阈值控制都是用Apollo配置中心来做,实现配置热更新,在高可用上实践也不错。很多时候多预埋这些配置就是用来保命的,当监控发现趋势不对时,可快速调整规避事故发生,简单列些例子:

  1. 后端限流阈值大小,后端要过载时可调小
  2. Cache缓存时间,数据层负载高时可调大
  3. 非核心路径后端调用开关,必须时关闭调用补上降级默认值
  4. 前端定时调用的间隔时间,后端要过载时可调大 ......

当然,如果可做到系统自动触发调整配置就更进一步了,当时有想过但时间太赶没实践,有兴趣同学可思考实践下

Apollo是携程开源的分布式配置中心,能够集中化管理应用不同环境配置,实现配置热更新,具备规范的权限、流程治理等特性,适用于微服务配置管理场景。补个架构图推荐下:

apollo架构图.png
apollo架构图.png

阶段5:服务性能优化实战

在抗住前2周最猛的流量增长后,下来很长一段时间都是在优化服务的性能和稳定性、处理用户反馈和打磨产品体验上。这里沉淀3个服务性能优化上印象较深刻的点

分析利器 pprof+torch

在性能分析上,对比c++,golang提供了更多好用的工具,基本每次性能分析都是先用pprof+torch跑一把。通过框架中嵌入net/http/pprof并监听http遥测端口,管理后台就可随时得到svr协程/cpu/内存等相关指标,比如优化前的成员列表svr火焰图case

结合代码,便可快速有些优化思路,比如:

  1. 分离B/C调用部署
  2. 优化pb序列化,如做些cache
  3. 简化定时器使用场景
  4. 调整大对象使用优化gc消耗

最终根据这些优化思路改版,让超200ms的比例从0.2%降到0.002%以下

性能优化效果.png
性能优化效果.png

缓存设计和踩坑

回过头看,大部分服务性能瓶颈还是在数据层或Rpc调用上,很多时候数据一致性要求没那么高,加缓存是最简单的首选方案。

关于缓存的设计,无论是本地缓存、分布式缓存、多级缓存,还是Cache Aside、Read/Write Through、Write Behind Caching等缓存模式,就看哪种更适合业务场景,这里也不累赘,核心说下这次实践中踩的2个坑:

1、缓存击穿

  • 案例:高频访问的缓存热key突然失效,导致对这个key的读瞬间压到DB上飙高负载
  • 方案:使用异步更新或者访问DB加互斥锁

2、缓存穿透

  • 案例:访问DB中被删除的key,这些key在缓存中也没有,导致每次读直接透到DB
  • 方案:把这些key也缓存起来,但要关注恶意扫描的影响

为啥qps压不上去?

疫情期间,有一个现象很奇怪但又经常出现:压测时cpu很低,pprof+torch看不出什么异常,数据层返回也很快,但吞吐量就是上不去。一开始思路较少,后面也慢慢知道套路了,这里列几个真实的case供参考:

  1. 锁竞争:如死锁、锁粒度太大等,关注锁时间上报
  2. 打日志:日志量过大等导致磁盘IO彪高,在高并发场景尤其要注意精简日志量
  3. 进程重启:如panic或oom导致进程被kill,重启过程请求超时,要补齐进程重启监控
  4. 队列丢包:如请求缓存队列设置过小等,要关注队列溢出监控 ......

比如最后这点,就遇过这样的case:一次凌晨压测,其他机器都正常,就2个新机器死活一直超时,业务指标也看不出区别,折腾了好一阵,才发现monitor上 监听队列溢出(ListenOverflows) 这个值有毛刺异常。

继续深挖下去,证明请求在tcp队列就溢出了,tcp的accept队列长度=min(backlog,SOMAXCONN),查看新机器内核配置 net.core.somaxconn=128,确实比其他机器小,神坑

所以后续也增加了服务器tcp的半连接和全连接队列相关监控:

tcp监听队列.png
tcp监听队列.png

挂个招聘

在这次疫情的推动下,在线教育越来越普及,各大互联网公司都持续加码,教育也是个有温度的事业,百年大计,教育为本。团队聚焦golang和云原生,还有大量后台HC希望大家推荐或自荐,欢迎随时勾搭。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 腾讯课堂停课不停学
    • 项目背景
      • 极速版的诞生
        • 疫情期间开发缩影
          • 架构挑战
          • 阶段1:先抗住后优化
            • 模块梳理和接口裁剪
              • 系统容量评估
                • 扩容扩容扩容!!
                  • 全链路压测
                  • 阶段2:瓶颈最先出在DB数据层
                    • 核心DB,一挂全挂
                      • 业务横向拆分
                        • 慢查询优化
                          • 链接数优化
                          • 阶段3:核心模块逐个专项击破
                            • 接入:血的教训
                              • 直播:站在云的肩膀上
                                • 消息:走推走拉?
                                • 阶段4:做好核心路径的防过载和柔性降级
                                  • 雪崩来得猝不及防
                                    • 过载保护策略
                                      • 限流和熔断
                                        • Apollo配置中心
                                        • 阶段5:服务性能优化实战
                                          • 分析利器 pprof+torch
                                            • 缓存设计和踩坑
                                              • 为啥qps压不上去?
                                              • 挂个招聘
                                              领券
                                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档

                                              相关内容推荐

                                              信息网络公司 内容成都肆零肆网络公司绵阳蓝洋网络公司清远盛天科技网络公司安徽红嘴鸥网络公司深圳小黑熊网络公司兰州市网络公司月薪海南极米互娱网络公司买卖科技网络公司网络公司顺德网络公司做服务器某网络公司网络规划快出门网络公司怎么样网络公司经营范围及代码山西广电信息网络公司薪资广西广电网络公司陆浩杭州拾味人生网络公司共和县网络公司濮阳seo网络公司百娱网络公司长沙亚美网络公司棋牌网络公司联系方式陕西小程序网络公司杭州蒂范德网络公司上海网络公司注册费用无线通讯网络公司有几个湘潭网络公司优选磐石网络南宁网络公司注册网络公司自愿加班西安用友网络公司销售总监齐成果58房源网络公司总账号网站网络公司安全标语网络公司 杨宇各大网络公司总裁荆州网络公司到1火星下拉网络游戏免费上海网络公司上海比捷网络公司网络公司资金来源au网络公司恩情网络公司滴滴打车属于网络公司吗网络公司的提成一般是多少甘肃广电网络公司排名济南怎么开网络公司潍坊网络公司有多少家一个气氛超嗨的网络公司长沙包住网络公司江门网络公司推荐7火星下拉漳州网络公司选1火星奥菲科技网络公司昭通电视网络公司浙江休齐网络公司深圳深度云网络公司六盘水绍兴网络公司天津宽带网络公司哪家好社区网络公司有名网络公司的价格湖南手机网络公司我国著名网络公司网络公司如何在抖音推广唐山网络公司到9火星下拉优里优选网络公司意源通信网络公司网络公司年度工作计划ppt湖南衡阳电广网络公司全国最大的网络公司是那个通彩网络公司河南联通idc网络公司网络公司租赁合同修改洪湖市环维网络公司市广电网络公司组织架构湖南广电数字电视网络公司重庆鼎维科技有限网络公司安顺市广电网络公司领导杭州旷古网络公司洪洪网络公司广东省广电网络公司人事部电信网络公司行销企划案前言江西彼梦网络公司宝鸡网络公司首选丙丁元长春网络公司地址清远盛天科技网络公司东莞定制冷库网络公司常德创游网络公司沈阳最大的网络公司网络公司售后服务项目图特科技网络公司石家庄蓝点网络公司山东广电网络公司有多少客服廊坊114网络公司新会网络公司冈州大道彭州广电网络公司官网随州网络公司立荐18火星北京高端网络公司北京大兴新宫网络公司年轻人适合在广电网络公司吗成都比瑞波恩网络公司最新介绍信阳港网络公司通化网络公司选择8火星石家庄注册一个小网络公司322医院哪有什么网络公司网络公司综合服务方案和学校合作的网络公司心动网络公司股票网络公司投诉热线华为小米网络公司品牌营销布马网络公司网络公司pe岗位上海趣炫网络公司好不好天津刘园网络公司葫芦岛网络公司要找2火星张家界网络公司首推30火星重庆日日新网络公司座机号网络科技和网络公司咸宁网络公司立荐2火星恒生网络公司不缴纳罚款浙江雷龙网络公司有什么游戏网络公司天使轮深圳银之狐网络公司青海巨人科技网络公司黄山网络公司找5火星菏泽千虎网络公司杭州久其网络公司快易购网络公司上班可靠吗定西运营好的网络公司报价蚌埠注册网络公司费用多少江西宽度网络公司名气大的网络公司旗云网络公司三明网络公司首选25火星东莞力海网络公司在那宜春网络公司选择1火星南通广电网络公司领导班子网络公司开晨会宁波象山县网络公司临沧网络公司首荐6火星下拉进入网络公司需要湖南新化网络公司招聘台湾媒体到大陆参访网络公司蒙自市广电网络公司上班时间网络公司用上税吗商维网络公司是干嘛的德阳网络公司推荐3火星网络公司需不需要办理营业执照北京巨鑫网络公司金昌网络公司就找1火星下拉大气的网络公司源码大型网络公司在哪里河南九人拼网络公司靠谱吗游族网络公司财务总监迪拜网络公司招聘能去吗大庆网络公司选9火星莱芜网络公司怎么样网络公司违规内容网络公司渠道运营景山网络公司模拟网络公司简介ppt临沂品牌网络公司网络公司主机系统武汉优化网络公司临沧网络公司选17火星下拉菜鸟网络公司配送合肥思皓网络公司甘肃网络公司业务菜鸟网络公司配送广州世达网络公司怎么样网络公司如何市场营销策划凤冈网络公司电话毕节网络公司选择12火星启明网络公司官网德兴市网络公司网络公司投诉热线百信网络公司广东海南广电网络公司湘西自治州联合网络公司中国网络公司的估值大型网络公司在哪里中国最好的网络公司排行西安柠檬世尚网络公司靖江市天骄大楼网络公司北京第一时间科技网络公司行星网络公司多益网络公司管理现状网络公司离职审计报告湖南有线东安网络公司毕业生开网络公司政府扶持网络公司内勤属于什么行业火星网络公司怎么样三明网络公司选择20火星南京壹鼎诚网络公司北京百道世纪网络公司徐州网络公司就推14火星哈尔滨网络公司复工时间崇左网络公司推荐3火星下拉浙江微鱼网络公司房山区开网络公司昆山沛丰网络公司怎么样广电网络公司实行打卡上班运营网络公司取名测云码网络公司产品

                                              合作伙伴

                                              天下网标王

                                              龙岗网络公司
                                              深圳网站优化
                                              龙岗网站建设
                                              坪山网站建设
                                              百度标王推广
                                              天下网标王
                                              SEO优化按天计费
                                              SEO按天计费系统