PostgreSQL 索引与 配置中心 的正确姿势
PostgreSQL 索引与 配置中心 的正确姿势 前阵子把公司配置中心的存储从 MySQL 迁到了 PostgreSQL,刚切完那会儿一切正常,跑了两三个月之后,同事突然跟我说,发布配置的页面转圈越来越久,翻一下配置变更历史要三四秒才出来。我寻思配置中心能有多大数据,进库里一看,好家伙,变更历史表已经攒了八百多万行了... 行吧,当初偷的懒,迟早是要还的。 先搞清楚慢在哪,别急着加索引 加索引之...
阅读更多PostgreSQL 索引与 配置中心 的正确姿势 前阵子把公司配置中心的存储从 MySQL 迁到了 PostgreSQL,刚切完那会儿一切正常,跑了两三个月之后,同事突然跟我说,发布配置的页面转圈越来越久,翻一下配置变更历史要三四秒才出来。我寻思配置中心能有多大数据,进库里一看,好家伙,变更历史表已经攒了八百多万行了... 行吧,当初偷的懒,迟早是要还的。 先搞清楚慢在哪,别急着加索引 加索引之...
阅读更多Kubernetes 消息队列 配置避坑指南 前阵子把消息队列从裸机迁到 K8s 上,本以为就是个写写 yaml 的事儿,结果 RabbitMQ 加 Kafka 前后折腾了一个多星期,中间踩的坑一个接一个,有些报错跟实际问题八竿子打不着,排查起来相当折磨(也可能是我太菜了...)。这里把印象比较深的几个坑记一下,没准儿能帮后来的人少走点弯路。 先交代一下环境:K8s 1.28,RabbitMQ 用...
阅读更多WebSocket 实时通信与 蓝绿部署 应用 前阵子给公司内部的一个实时看板升级后端,这玩意儿走的是 WebSocket 长连接,平时倒也相安无事,结果一发布就出事:旧实例一停,几百个用户的连接瞬间全断,前端虽然写了重连逻辑,但大家都是同一秒断的,重连请求跟约好了似的挤在同一秒打过来,新实例刚起来就被怼了一波,CPU 直接拉满。后来才想明白,这就是典型的重连风暴。普通 HTTP 服务用滚动发布没...
阅读更多Rust 所有权模型与 缓存一致性 的思考 前阵子优化一个多线程计数的小工具,逻辑特别简单:几个线程各写各的统计变量,最后汇总一下。结果性能死活上不去,用 perf 一看,热点居然落在根本没几行代码的地方。查了半天资料才反应过来是 false sharing——几个变量挤在同一条 cache line 上,硬件层面天天打架。顺藤摸瓜去补 MESI 协议的时候,看着看着突然愣住了:这套东西怎么越看越...
阅读更多正则表达式进阶:鉴权体系 匹配技巧 前段时间给公司的网关加统一鉴权,方案是 nginx authrequest + JWT,思路很简单:所有请求先被网关拦一道,丢给鉴权服务验签,通过了才放行到上游。听着挺美好,结果联调第一天就翻车了,健康检查、支付回调、还有一堆 /public 开头的静态资源全被 401 了,上游一个请求都没收到。一开始我的想法是给每个路径单独加 location,写到第十几个的...
阅读更多从零实现一个简易的任务调度
阅读更多限流 的十种打开方式:工程实践笔记 前段时间一个导出接口被人拿脚本刷了,QPS 瞬间冲到平时的几十倍,数据库连接池直接被占满,连带着一堆不相干的接口也跟着趴窝。事后复盘的时候发现,这服务裸奔快两年了,什么限流都没有...趁着修 bug 的功夫,把限流这摊子事从头捋了一遍,能想到的打开方式都记在这儿,省得下次再抓瞎。 一、固定窗口计数器 最直觉的做法就是数数:一分钟最多放 100 个请求,超了直接打...
阅读更多分布式锁:写给初学者的通俗解释 前不久上线了一个领优惠券的功能,规则很简单,每个用户限领一张。结果运营半夜找过来,说有个用户领了三张。我翻日志翻到凌晨,代码里的判断写得明明白白,if (received >= 1) return;,逻辑挑不出任何毛病。后来才反应过来:服务是三个实例一起跑的,三个请求分别打到了三台机器上,每台机器都自己判断了一遍“他还没领过”,然后就各发各的了。 这事之后我才明白,...
阅读更多Redis 缓存穿透、雪崩与 日志采集 上个月值晚班,凌晨两点多被告警叫醒,一个商品详情接口的耗时从20ms飙到了3s,数据库CPU直接拉满,连接池也满了。第一反应是有慢SQL,登上服务器一看,应用日志里全是同一个请求在刷:GET /goods/999999,而这个ID压根就不存在。也就是说请求根本没被缓存挡住,全部打穿到了数据库上。当时日志散在三台机器上,我是挨个 grep 才把现场拼出来的,折...
阅读更多机器学习入门:数据脱敏 数据预处理 起因 前阵子接了个小活儿,要拿一批真实用户数据训练个分类模型,结果打开 csv 一看,姓名、手机号、身份证号全在里面。直接拿去训练肯定不行,万一哪天数据泄露出去,麻烦就大了。以前总觉得数据脱敏是安全团队该操心的事,真轮到自己头上才发现,这活儿不提前想好,等数据已经散出去了再补救,基本就是灾难现场。 顺便把预处理也一起捋一遍,毕竟脱敏完的数据也不能直接喂模型,中间...
阅读更多