上个月折腾聊天网站差点整崩溃了,具体表现是每次刷新网页都得卡上五六秒,用户消息经常发不出去。后台数据库天天飙CPU警告,吓得我赶紧掏出监控工具查,结果发现最要命的就这仨问题:每次进聊天室都要狂刷数据库翻旧消息,用户发消息得等轮询间隔才能推送,网页里那些群成员列表图片加载直接卡死整页。行,直接上实测方案。
先给数据库减减压
旧方案蠢得不行,用户进聊天室就喊数据库:“把这群三年内的聊天记录全给我吐出来!”服务器当场表演吐血。连夜改造成两板斧:第一斧把群成员信息扔进Redis缓存里,网页只读不写数据库;第二斧把默认加载消息砍到100条,用户往下滑才加载更多。改完压测时眼瞅着数据库CPU从90%掉到20%,跟坐过山车似的。
死磕消息延迟问题
本来用轮询推送消息,用户发条消息对面得等驴车慢悠悠送过去,经常被吐槽“我消息是被你吃了吗?”咬咬牙换成WebSocket,客户端直接挂个长连接管道。刚开始连握手协议都配错,调试时客户端疯狂刷400报错,气得我对着屏幕吼:“你再报错试试!”熬到凌晨三点终于调通,现在用户打字刚敲回车,对面头像就弹出新消息,爽得我猛灌两罐红牛。
干掉网页全家桶加载
最无语是用户列表加载逻辑——非得等七十多个头像图全下载完才显示网页。那天测试时盯着Chrome瀑布流图发呆,看到满屏蓝条跟斑马线似的。直接祭出懒加载大法:用户不往下拉就只加载当前屏幕的头像。改完刷新网页秒开,再也不用看进度条转圈表演了,顺手把群公告字体调大两号,省得老有人问群规在哪。
实测一周效果拉满:消息延迟从3秒压到200毫秒以内,服务器月费账单直接降三成。唯一后遗症是昨天发现聊天室深夜飙到五百人时WebSocket突然崩了,现在正满地找扩容方案。果然搞网站就是打地鼠,锤完这三个又冒新的...