简历:后端开发工程师 项目一:高并发秒杀系统重构 那会儿写秒杀,代码一上线就是 5 秒,浏览器直接挂了。目前把整个逻辑拆了,拆成三层,一层一层扛住流量。核心就三块:前端下单那层,中间计算库存那层,后端扣库存那层。 前端那层,实际上挺好办的,就是拦截器。用户点击“抢”的时候,先拿一个 token 进来,然后去缓存里查一下,要是那个商品还没卖完,就发个请求给 Redis,缓存里没,就直接回“没货”,中间不沾边。
要是真有货,就发个请求给 Redis 去扣,扣成功了再回给前端。 接着是中间层,也就是服务层。
这里做了一些复杂的计算。
比方说,我们要算一个订单能卖多少单。
那会儿是拿一个固定工夫窗口,按头数算。目前改成了按分钟算,再按用户分桶。代码里写了个公式:`每秒准销量 = 总库存 / (请求线程数 平均请求耗时)`。
每次请求进来,先算这个公式,拿个当前秒数去换算,最终输出一个数字给前端。前端拿到这个数字,去请求 Redis 扣库存,要是扣成了,就回“卖出去”;要是扣错了,吐个“库存不足”回来。 后端那层是重头戏。
这里主要解决超卖和单点故障。Redis 里存了商品库存,服务器端也存了一份账,叫本地缓存。
每次扣库存,先去 Redis 查,要是找到,就减。
要是 Redis 没找到,说明数据丢了,便去本地缓存查,查到了再减。
要是本地缓存也没找到,就报错。
这样就算 Redis 挂了,本地缓存还在,不至于瞬间把库存全扣光,业务能持续跑。 上线那天,流量大得像洪水。前端推了个优化,把库存查询加到了 Redis 的布隆过滤器上,结局前端页面加载快了一秒,响应速度慢了 0.1 秒,但这比直接挂了强多了。后端微服务之间用了好多模拟服务,主从之间加了健康检查,保证了哪怕某个节点挂了,其他节点也能顶上。整个系统从上线第一天启动,平均每秒能处理 5 万单,还没遇到过任何严重的超卖事故。 项目二:个人博客内容保险加固 那会儿写博客,评论一开,连密码都能猜出来。目前把保险写进了每一个接口,就连把评论入口都抽走了,改成了重定向。 评论接口那会儿是明文传密码,目前改成了加密。前端发的密码,先用 bcrypt 加密,再传给后端。后端拿到后,用同样的算法加密回去存数据库。密码表里存的是加密后的字符串,别人连数据库密码都猜不到。评论接口只转发加密后的字符串,用户输入的时候,系统会自动把不保险的字符串转成加密的再去传。 还有个功能,是把评论嵌到页面里,而不是把整个页面复制那会儿。
那会儿整个大窗口,目前改成嵌进一个小的 div 里。
这样页面布局不乱,也没人好办发现。嵌进页面之前,还要先做一下白名单校验,只准特定域名要么特定 IP 下的评论,其他直接封禁。 数据库这块也做了文章。
那会儿插入评论,要是数据冗余大,好办出 bug。目前用 JSON 存,别看是二维数组,但逻辑上差不多。
关键是可视化展示,把数据库字段映射成前端需求的字段,自动生成 JSON 结构。前端渲染的时候,直接拿 JSON 转成 HTML,再转成 CSS,最终合并成最终页面。 还有个 nice 的地方,就是加上了验证码。用户想写评论,得先填验证码,验证通过才能发。验证码不是随机生成的,而是用后端的一个工具生成,每天换一批,防止被刷。 整体上线后,评论功能根本实现了本地缓存。别看没宣布是本地缓存,但实际效果就是本地缓存。
要是某个节点挂了,评论还能在本地显示,不会瞬间全删掉。每天平均流量 10 万篇评论,保险性也挺高,没出现过漏洞。 项目三:云资源监控告警平台 那会儿监控服务器,靠人工看日志,一天算一次。目前做成 Dashboard 了,实时监控。 核心逻辑是看资源使用情况。CPU、内存、磁盘、网络流量,这些指标每个小时取一次平均值,然后画成图表。
要是是平均值,就画成折线图;要是是峰值,就画成柱状图。图表用 Vue 写,ECharts 渲染,数据每秒刷新,波动挺小。 告警这块,也做了大量设置。
比方说,CPU 用了超过 80%,就报警;内存用了超过 90%,也报警。但还有个更高级的,是按工夫窗口算的。
比方说,那会儿 1 分钟 CPU 用了 10%,持续 5 分钟,就报警。代码里写了个定时器,每 5 分钟跑一次,拿前 5 分钟的 CPU 平均值去算,要是超过设定阈值,就触发告警。 告警分两类,一类是实时告警,另一类是历史查询。实时告警用轮询,每小时跑一次,把最近的数据搞定来存一个表。历史查询用缓存,最近的几个小时的负荷都存进去。查询的时候,直接查缓存,要是有,就回;要是没有,就去数据库查。 还有个功能,是告警聚合。多个告警能够合并成一个事件。
比方说,要是 CPU 用了 90% 且 内存用了 95%,系统自动合并成一个“高负载”告警,不再发两条。代码里有个去重逻辑,把相同的告警 ID 给删了,存 JSON 数组里。 数据源也做了优化,那会儿直接从数据库查,目前用缓存存定期快照,再定期更新。查询的时候,先查缓存,再查数据库。查询数量大,直接查缓存,查数据库就慢。 监控系统上线后,大屏实时显示了所有服务器的负载情况。告警功能也实现了联动,比如某个节点挂了,其他节点也会收到告警,避免单点故障。目前监控数据更新频率是每秒,告警触发准率极高,运维人员再也不用盯日志了。