Redis 缓存穿透、雪崩与 缓存一致性
Redis 缓存穿透、雪崩与 缓存一致性 前段时间接手了一个老服务,缓存这块写得很朴素,就是经典的“查缓存,没有就查库,查完回写”。我一开始也没觉得有啥问题,直到某天凌晨被告警短信吵醒,看了一眼监控,MySQL 的连接数和 CPU 直接拉满,缓存命中率却掉得一塌糊涂。排查了一圈,发现是缓存这层埋了几个经典的坑。趁还热乎,把这几个问题和解法整理一下,免得下次再踩。 缓存穿透:查一个根本不存在的数据 ...
阅读更多Redis 缓存穿透、雪崩与 缓存一致性 前段时间接手了一个老服务,缓存这块写得很朴素,就是经典的“查缓存,没有就查库,查完回写”。我一开始也没觉得有啥问题,直到某天凌晨被告警短信吵醒,看了一眼监控,MySQL 的连接数和 CPU 直接拉满,缓存命中率却掉得一塌糊涂。排查了一圈,发现是缓存这层埋了几个经典的坑。趁还热乎,把这几个问题和解法整理一下,免得下次再踩。 缓存穿透:查一个根本不存在的数据 ...
阅读更多微服务架构下 鉴权体系 的设计与权衡 最近把手头一个跑了三四年的单体应用往微服务上拆,业务逻辑迁移都还算顺利,结果在鉴权这块卡了好几天。单体的时候一个 Session 走天下,登录之后用户信息往 ThreadLocal 一塞就完事了,拆完之后发现事情完全不对:用户在服务 A 登录了,服务 B 压根不认识你是谁。网上搜了一圈,大部分文章要么无脑吹 JWT 无状态多好多好,要么就是画一堆架构图讲“集中...
阅读更多Python 异步编程与 优雅停机 实践 起因 前阵子写了个基于 asyncio 的消费服务,从队列里拿任务、处理、写库,平时跑得好好的。直到有一天更新部署,习惯性 docker compose restart 下去,服务是重启了,一查数据库发现好几条记录状态停在中间,消息队列里还躺着一堆 unacked 的消息等着重投,等于这批活儿白干了。 最早我还试图自救过一把,在信号处理里直接 loop.s...
阅读更多Rust 所有权模型与 蓝绿部署 的思考 最近同时在干两件看起来毫不相关的事:下班啃 Rust,上班给公司一个老服务从滚动发布改成蓝绿部署。本来以为一个语言特性、一个发布策略,八竿子打不着,结果越做越觉得它们在讲同一件事:一个资源同一时刻只能有一个所有者,交接必须显式,不能靠猜。 先说 Rust 那边 Rust 里每个值都有明确的所有者,赋值默认是 move 而不是 copy,旧的变量移交之后就失...
阅读更多React 项目中 消息队列 的设计取舍 最近在改公司的客服聊天模块,踩了一堆坑。起因很简单:测试提了个 bug,说快速发消息的时候偶尔会出现自己发的两条消息顺序颠倒,还有小概率某条消息直接消失。我第一反应是不可能,socket 本身是有序的啊。结果排查了两天发现,socket 确实有序,但消息从 onmessage 到 setState 再到渲染,中间被我们自己的代码搅得一塌糊涂。说白了,项目里...
阅读更多Nginx 反向代理 灰度发布 配置详解 最近公司项目要上灰度发布,本来想着找个现成的网关方案,什么 K8s + Istio 之类的,结果一算成本和复杂度,算了,咱们这小体量,Nginx 自己配一下就够了。折腾了两天,踩了几个坑,把实测可用的方案记录一下,免得下次又忘了。 什么是灰度发布 简单说就是新版本代码部署上去之后,不是一刀切把所有流量都切过去,而是先放一小部分用户(比如 5%)到新版本上,...
阅读更多从零实现一个简易的优雅停机 前段时间部署服务的时候遇到一个很烦的问题:每次发新版,kill 掉旧进程的瞬间,正在处理的请求直接被掐断了,客户端那边时不时收到连接被重置的报错。一开始还以为是网络问题,排查了半天才发现,就是停机的时候太粗暴了。所以这次干脆花点时间,自己动手实现一个简易的优雅停机,顺便把过程记录下来。 什么是优雅停机 简单说就是:进程收到退出信号后,不再接收新的请求,但是把手头正在处理...
阅读更多React 项目中 日志采集 的设计取舍 起因是上个月线上出了个事儿,有个用户反馈说点提交按钮没反应,我让他打开控制台截图发过来,好家伙,一排红色的 Unhandled Rejection。可我自己这边怎么都复现不了,翻了半天代码才反应过来,那块逻辑在 try/catch 里把错误吞了,只打了个 console.error,而生产环境的 console 早就被构建脚本干掉了... 那一刻我才意识到...
阅读更多Rust 所有权模型与 连接池 的思考 最近在用 Rust 重写一个老项目,里面有个场景是要频繁读写数据库,自然就绕不开连接池这个东西。用的时候突然意识到,连接池这个概念在 Rust 里面变得特别有意思,跟我在 Go 或者 Java 里用连接池的心路历程完全不一样,索性写篇文章记录一下。 先说说所有权模型这件事 Rust 的所有权模型,说白了就三条规则:每个值都有一个所有者,同一时刻只能有一个所有...
阅读更多Kubernetes 限流 配置避坑指南 起因:本来想防刷,结果把自己刷趴了 前阵子有个对外的接口被人拿脚本刷,半夜告警响个没完,寻思着在 Ingress 上配个 nginx.ingress.kubernetes.io/limit-rps 就完事了,阈值还特意设得挺宽裕。结果上线十来分钟,服务大面积 503,pod 接连重启,用户骂声一片。限流明明是用来保护服务的,怎么先把自家服务干趴了? 排查下...
阅读更多