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

↓ 向下滚动

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,旧的变量移交之后就失...

阅读更多

React 项目中 消息队列 的设计取舍

React 项目中 消息队列 的设计取舍 最近在改公司的客服聊天模块,踩了一堆坑。起因很简单:测试提了个 bug,说快速发消息的时候偶尔会出现自己发的两条消息顺序颠倒,还有小概率某条消息直接消失。我第一反应是不可能,socket 本身是有序的啊。结果排查了两天发现,socket 确实有序,但消息从 onmessage 到 setState 再到渲染,中间被我们自己的代码搅得一塌糊涂。说白了,项目里...

阅读更多

Nginx 反向代理 灰度发布 配置详解

Nginx 反向代理 灰度发布 配置详解 最近公司项目要上灰度发布,本来想着找个现成的网关方案,什么 K8s + Istio 之类的,结果一算成本和复杂度,算了,咱们这小体量,Nginx 自己配一下就够了。折腾了两天,踩了几个坑,把实测可用的方案记录一下,免得下次又忘了。 什么是灰度发布 简单说就是新版本代码部署上去之后,不是一刀切把所有流量都切过去,而是先放一小部分用户(比如 5%)到新版本上,...

阅读更多

从零实现一个简易的优雅停机

从零实现一个简易的优雅停机 前段时间部署服务的时候遇到一个很烦的问题:每次发新版,kill 掉旧进程的瞬间,正在处理的请求直接被掐断了,客户端那边时不时收到连接被重置的报错。一开始还以为是网络问题,排查了半天才发现,就是停机的时候太粗暴了。所以这次干脆花点时间,自己动手实现一个简易的优雅停机,顺便把过程记录下来。 什么是优雅停机 简单说就是:进程收到退出信号后,不再接收新的请求,但是把手头正在处理...

阅读更多

React 项目中 日志采集 的设计取舍

React 项目中 日志采集 的设计取舍 起因是上个月线上出了个事儿,有个用户反馈说点提交按钮没反应,我让他打开控制台截图发过来,好家伙,一排红色的 Unhandled Rejection。可我自己这边怎么都复现不了,翻了半天代码才反应过来,那块逻辑在 try/catch 里把错误吞了,只打了个 console.error,而生产环境的 console 早就被构建脚本干掉了... 那一刻我才意识到...

阅读更多

Rust 所有权模型与 连接池 的思考

Rust 所有权模型与 连接池 的思考 最近在用 Rust 重写一个老项目,里面有个场景是要频繁读写数据库,自然就绕不开连接池这个东西。用的时候突然意识到,连接池这个概念在 Rust 里面变得特别有意思,跟我在 Go 或者 Java 里用连接池的心路历程完全不一样,索性写篇文章记录一下。 先说说所有权模型这件事 Rust 的所有权模型,说白了就三条规则:每个值都有一个所有者,同一时刻只能有一个所有...

阅读更多

Kubernetes 限流 配置避坑指南

Kubernetes 限流 配置避坑指南 起因:本来想防刷,结果把自己刷趴了 前阵子有个对外的接口被人拿脚本刷,半夜告警响个没完,寻思着在 Ingress 上配个 nginx.ingress.kubernetes.io/limit-rps 就完事了,阈值还特意设得挺宽裕。结果上线十来分钟,服务大面积 503,pod 接连重启,用户骂声一片。限流明明是用来保护服务的,怎么先把自家服务干趴了? 排查下...

阅读更多
未在播放