Redis 缓存穿透、雪崩与 日志采集
Redis 缓存穿透、雪崩与 日志采集 上个月值晚班,凌晨两点多被告警叫醒,一个商品详情接口的耗时从20ms飙到了3s,数据库CPU直接拉满,连接池也满了。第一反应是有慢SQL,登上服务器一看,应用日志里全是同一个请求在刷:GET /goods/999999,而这个ID压根就不存在。也就是说请求根本没被缓存挡住,全部打穿到了数据库上。当时日志散在三台机器上,我是挨个 grep 才把现场拼出来的,折...
阅读更多Redis 缓存穿透、雪崩与 日志采集 上个月值晚班,凌晨两点多被告警叫醒,一个商品详情接口的耗时从20ms飙到了3s,数据库CPU直接拉满,连接池也满了。第一反应是有慢SQL,登上服务器一看,应用日志里全是同一个请求在刷:GET /goods/999999,而这个ID压根就不存在。也就是说请求根本没被缓存挡住,全部打穿到了数据库上。当时日志散在三台机器上,我是挨个 grep 才把现场拼出来的,折...
阅读更多机器学习入门:数据脱敏 数据预处理 起因 前阵子接了个小活儿,要拿一批真实用户数据训练个分类模型,结果打开 csv 一看,姓名、手机号、身份证号全在里面。直接拿去训练肯定不行,万一哪天数据泄露出去,麻烦就大了。以前总觉得数据脱敏是安全团队该操心的事,真轮到自己头上才发现,这活儿不提前想好,等数据已经散出去了再补救,基本就是灾难现场。 顺便把预处理也一起捋一遍,毕竟脱敏完的数据也不能直接喂模型,中间...
阅读更多熔断 的十种打开方式:工程实践笔记 之前一直觉得熔断这东西,面试背背“三态转换”就够了,实际项目里谁真配啊。直到上个月一个边缘的推荐服务抽风,RT 从 20ms 飙到 3s,把上游订单详情页的线程池打满,最后连网关一起躺下,整个站凉了二十分钟。复盘会上大家齐刷刷说“要有熔断就没这事儿”,然后发现熔断这玩意儿全公司没一处真正落地。于是花了两个周末把能用的姿势挨个摸了一遍,记录如下,省得下次事故再背锅...
阅读更多Redis 缓存穿透、雪崩与 配置中心 上周三晚上运营搞了个限时秒杀,活动开始不到两分钟,数据库 CPU 直接飙到 100%,接口超时报警响个不停。排查下来发现,凌晨批量刷进 Redis 的一批商品数据用的是同一个过期时间,正好卡在活动开始这个点集体失效,请求一股脑全砸到了数据库上。当时群里有人管这叫击穿,严格来说单个热点 key 失效才叫击穿,大批 key 一起失效才是雪崩,那天算是两个都占了。...
阅读更多Rust 所有权模型与 配置中心 的思考 最近在给一个 Rust 写的内部小服务接配置中心,本来以为就是启动的时候拉个配置的事儿,结果产品说改了配置要立刻生效,不许重启。行吧,那就做热更新。然后就掉坑里了:一个全局配置变量,想改,编译器不让;想读,也一堆讲究。折腾了两天回头一看,配置中心这套东西跟 Rust 的所有权模型居然是能一一对上的,索性记录一下。 先说踩的坑 最开始的写法很朴素,全局放一个...
阅读更多Go 语言 分布式锁 实战:从原理到落地
阅读更多Redis 缓存穿透、雪崩与 缓存一致性 前段时间接手了一个老服务,缓存这块写得很朴素,就是经典的“查缓存,没有就查库,查完回写”。我一开始也没觉得有啥问题,直到某天凌晨被告警短信吵醒,看了一眼监控,MySQL 的连接数和 CPU 直接拉满,缓存命中率却掉得一塌糊涂。排查了一圈,发现是缓存这层埋了几个经典的坑。趁还热乎,把这几个问题和解法整理一下,免得下次再踩。 缓存穿透:查一个根本不存在的数据 ...
阅读更多微服务架构下 鉴权体系 的设计与权衡 最近把手头一个跑了三四年的单体应用往微服务上拆,业务逻辑迁移都还算顺利,结果在鉴权这块卡了好几天。单体的时候一个 Session 走天下,登录之后用户信息往 ThreadLocal 一塞就完事了,拆完之后发现事情完全不对:用户在服务 A 登录了,服务 B 压根不认识你是谁。网上搜了一圈,大部分文章要么无脑吹 JWT 无状态多好多好,要么就是画一堆架构图讲“集中...
阅读更多Python 异步编程与 优雅停机 实践 起因 前阵子写了个基于 asyncio 的消费服务,从队列里拿任务、处理、写库,平时跑得好好的。直到有一天更新部署,习惯性 docker compose restart 下去,服务是重启了,一查数据库发现好几条记录状态停在中间,消息队列里还躺着一堆 unacked 的消息等着重投,等于这批活儿白干了。 最早我还试图自救过一把,在信号处理里直接 loop.s...
阅读更多Rust 所有权模型与 蓝绿部署 的思考 最近同时在干两件看起来毫不相关的事:下班啃 Rust,上班给公司一个老服务从滚动发布改成蓝绿部署。本来以为一个语言特性、一个发布策略,八竿子打不着,结果越做越觉得它们在讲同一件事:一个资源同一时刻只能有一个所有者,交接必须显式,不能靠猜。 先说 Rust 那边 Rust 里每个值都有明确的所有者,赋值默认是 move 而不是 copy,旧的变量移交之后就失...
阅读更多