小Cの已经记不起来的博客

↓ 向下滚动

Redis 缓存穿透、雪崩与 日志采集

Redis 缓存穿透、雪崩与 日志采集 上个月值晚班,凌晨两点多被告警叫醒,一个商品详情接口的耗时从20ms飙到了3s,数据库CPU直接拉满,连接池也满了。第一反应是有慢SQL,登上服务器一看,应用日志里全是同一个请求在刷:GET /goods/999999,而这个ID压根就不存在。也就是说请求根本没被缓存挡住,全部打穿到了数据库上。当时日志散在三台机器上,我是挨个 grep 才把现场拼出来的,折...

阅读更多

机器学习入门:数据脱敏 数据预处理

机器学习入门:数据脱敏 数据预处理 起因 前阵子接了个小活儿,要拿一批真实用户数据训练个分类模型,结果打开 csv 一看,姓名、手机号、身份证号全在里面。直接拿去训练肯定不行,万一哪天数据泄露出去,麻烦就大了。以前总觉得数据脱敏是安全团队该操心的事,真轮到自己头上才发现,这活儿不提前想好,等数据已经散出去了再补救,基本就是灾难现场。 顺便把预处理也一起捋一遍,毕竟脱敏完的数据也不能直接喂模型,中间...

阅读更多

熔断 的十种打开方式:工程实践笔记

熔断 的十种打开方式:工程实践笔记 之前一直觉得熔断这东西,面试背背“三态转换”就够了,实际项目里谁真配啊。直到上个月一个边缘的推荐服务抽风,RT 从 20ms 飙到 3s,把上游订单详情页的线程池打满,最后连网关一起躺下,整个站凉了二十分钟。复盘会上大家齐刷刷说“要有熔断就没这事儿”,然后发现熔断这玩意儿全公司没一处真正落地。于是花了两个周末把能用的姿势挨个摸了一遍,记录如下,省得下次事故再背锅...

阅读更多

Redis 缓存穿透、雪崩与 配置中心

Redis 缓存穿透、雪崩与 配置中心 上周三晚上运营搞了个限时秒杀,活动开始不到两分钟,数据库 CPU 直接飙到 100%,接口超时报警响个不停。排查下来发现,凌晨批量刷进 Redis 的一批商品数据用的是同一个过期时间,正好卡在活动开始这个点集体失效,请求一股脑全砸到了数据库上。当时群里有人管这叫击穿,严格来说单个热点 key 失效才叫击穿,大批 key 一起失效才是雪崩,那天算是两个都占了。...

阅读更多

Rust 所有权模型与 配置中心 的思考

Rust 所有权模型与 配置中心 的思考 最近在给一个 Rust 写的内部小服务接配置中心,本来以为就是启动的时候拉个配置的事儿,结果产品说改了配置要立刻生效,不许重启。行吧,那就做热更新。然后就掉坑里了:一个全局配置变量,想改,编译器不让;想读,也一堆讲究。折腾了两天回头一看,配置中心这套东西跟 Rust 的所有权模型居然是能一一对上的,索性记录一下。 先说踩的坑 最开始的写法很朴素,全局放一个...

阅读更多

Go 语言 分布式锁 实战:从原理到落地

Go 语言 分布式锁 实战:从原理到落地

阅读更多

Redis 缓存穿透、雪崩与 缓存一致性

Redis 缓存穿透、雪崩与 缓存一致性 前段时间接手了一个老服务,缓存这块写得很朴素,就是经典的“查缓存,没有就查库,查完回写”。我一开始也没觉得有啥问题,直到某天凌晨被告警短信吵醒,看了一眼监控,MySQL 的连接数和 CPU 直接拉满,缓存命中率却掉得一塌糊涂。排查了一圈,发现是缓存这层埋了几个经典的坑。趁还热乎,把这几个问题和解法整理一下,免得下次再踩。 缓存穿透:查一个根本不存在的数据 ...

阅读更多

微服务架构下 鉴权体系 的设计与权衡

微服务架构下 鉴权体系 的设计与权衡 最近把手头一个跑了三四年的单体应用往微服务上拆,业务逻辑迁移都还算顺利,结果在鉴权这块卡了好几天。单体的时候一个 Session 走天下,登录之后用户信息往 ThreadLocal 一塞就完事了,拆完之后发现事情完全不对:用户在服务 A 登录了,服务 B 压根不认识你是谁。网上搜了一圈,大部分文章要么无脑吹 JWT 无状态多好多好,要么就是画一堆架构图讲“集中...

阅读更多

Python 异步编程与 优雅停机 实践

Python 异步编程与 优雅停机 实践 起因 前阵子写了个基于 asyncio 的消费服务,从队列里拿任务、处理、写库,平时跑得好好的。直到有一天更新部署,习惯性 docker compose restart 下去,服务是重启了,一查数据库发现好几条记录状态停在中间,消息队列里还躺着一堆 unacked 的消息等着重投,等于这批活儿白干了。 最早我还试图自救过一把,在信号处理里直接 loop.s...

阅读更多

Rust 所有权模型与 蓝绿部署 的思考

Rust 所有权模型与 蓝绿部署 的思考 最近同时在干两件看起来毫不相关的事:下班啃 Rust,上班给公司一个老服务从滚动发布改成蓝绿部署。本来以为一个语言特性、一个发布策略,八竿子打不着,结果越做越觉得它们在讲同一件事:一个资源同一时刻只能有一个所有者,交接必须显式,不能靠猜。 先说 Rust 那边 Rust 里每个值都有明确的所有者,赋值默认是 move 而不是 copy,旧的变量移交之后就失...

阅读更多
未在播放