1.春节抢红包活动
抢红包活动最关键的点是解决高并发和库存超卖问题。
a.高并发
高并发包括页面请求和提交请求的高并发。
1)页面请求并发
要尽量采用静态化的方式处理。静态资源文件尽量放CDN以转移流量,整个页面静态化后保存到redis,并使用nginx+lua脚本读取以避免磁盘IO,这样做的目的是尽量前置流量,不要穿透到应用层。
2)提交请求并发
并发提交的流量也要避免穿透到应用层,思路也是采用nginx+lua+redis的方式,提前分配好每个红包保存到redis,lua脚本直接领取并快速返回给用户,领取后开启异步任务同步信息到DB并完成统计逻辑,保持最终一致性即可。这样做能最快速的响应用户,避免等待。
b.库存超卖
每个红包提前分配并保存到redis中,每次领取都是简单的lua+redis读取原子操作,原子操作保证了数据的一致性,避免超卖
2.网站定期宕机问题排查
突然遇到网站定期(大概是每周一中午左右)宕机问题,仔细分析JVM heap dump后,终于确定了错误原因:
a.依赖的地图定位服务白名单出错,每次向地图服务提供商发起定位请求都会报错
b.以上报错导致重试5次,即一个用户请求会触发5次定位请求
c.公众号发推文后流量暴增,导致定位请求流量暴增
d.每次定位请求都是一个短连接,占用一个端口,导致端口占用暴增
e.端口被占用完后,正常请求处理线程阻塞等待端口释放,应用无响应
排查过程很痛苦,要分析的原因太多太杂,但是学到了很多东西。