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

↓ 向下滚动

用 OpenAPI 契约驱动前端类型生成与接口测试

用 OpenAPI 契约驱动前端类型生成与接口测试 起因是一堆对不上的字段 前段时间在改一个后台项目,一个列表页的字段明明显示正常,复制出来的表格数据却是空的。查了半天,后端在某个版本里把 userName 改成了 username,而前端那个 interface 是几个月前照着接口文档手抄的,抄完之后再也没人碰过它。TS 也不会报错,因为从接口返回的数据本来就是 any,然后我们手动 as Us...

阅读更多

Django ORM 多表关联查询避免 N+1 问题的实践

Django ORM 多表关联查询避免 N+1 问题的实践 问题是怎么冒出来的 一开始我也没把列表页当回事。文章列表嘛,每行显示标题、作者、分类、评论数,再带两条最新评论,看起来挺简单。本地数据就几十条,页面嗖嗖的,完全感觉不到问题。结果数据一多,线上页面开始肉眼可见地慢,打开 Django Debug Toolbar 一看,好家伙,一条列表页干出来几百条 SQL。 当时第一反应是:“我也没写循环...

阅读更多

在 CI 中扫描容器镜像漏洞并与构建流程集成

在 CI 中扫描容器镜像漏洞并与构建流程集成 起因 之前我们的 CI 基本就是 build、push、完事。镜像能不能跑起来,靠测试;镜像里有没有已知漏洞,基本靠运气。直到有一次,一个已经上线挺久的服务被扫出来基础镜像里带了一堆高危包,我才认真去看 CI 里到底该怎么把镜像扫描这件事接进去。 一开始想得很简单:加一步扫描不就行了?真做起来发现细节还挺多,比如扫哪个镜像、什么时候扫、扫出来要不要卡构...

阅读更多

用 eBPF 观察容器网络丢包的基础实验步骤

用 eBPF 观察容器网络丢包的基础实验步骤 最近排查一个容器网络问题,应用侧说偶发超时,宿主机上看接口也没红,ss 里重传倒是有一些。想用 eBPF 看看包到底在哪儿没的,顺手把最小实验步骤记一下,免得下次又从零开始翻命令。 先说清楚,这个实验不是要复现某个特别复杂的生产故障,只是搭一个能稳定丢包的容器网络环境,然后用 bpftrace 去观察内核里跟丢包相关的事件。实验做完,至少能知道 kfr...

阅读更多

PHP Laravel 队列任务超时与重试次数配置建议

PHP Laravel 队列任务超时与重试次数配置建议 队列这东西吧,刚开始用的时候觉得挺爽,扔进去就不用管了。等你哪天真出问题了,去看日志,发现任务莫名其妙被重试了七八次,或者一个任务卡在那儿把 worker 全占满,才知道超时和重试这俩参数是真的得好好调,不然坑你没商量。 我前阵子就踩过一回:一个导数据的任务,跑个三五分钟很正常,结果队列配置里 retryafter 小于任务实际耗时,任务还没...

阅读更多

使用 Nuxt Server Routes 减少前端与私有 API 的重复代理

使用 Nuxt Server Routes 减少前端与私有 API 的重复代理 起因 手头有个 Nuxt 项目,后端是比较私有的 API,地址是内网 IP,不对外暴露。开发的时候在 nuxt.config.ts 里配一层 proxy,上线之后又在 nginx 里配一遍 location,两边的规则长得几乎一样,但就是得写两遍。后端说要把接口前缀从 /api 改成 /api/v2,我改完 nginx...

阅读更多

后端接口限流:令牌桶、漏桶和滑动窗口实现对比

后端接口限流:令牌桶、漏桶和滑动窗口实现对比 最近在给一个接口加限流,本来想着随便找个库糊上去完事,结果翻了几篇文章发现讲得都挺玄乎的,什么“令牌桶允许突发、漏桶恒定速率”,看完还是不知道代码该怎么写。索性自己把三种常见的实现都撸了一遍,顺便记一下踩过的坑,省得下次再翻。 先说清楚,这里聊的限流都是单机内存版的,分布式那种基于 Redis 的方案改天再单独写,不然一篇塞不下。 令牌桶:最常用的那个...

阅读更多

用 Terraform 管理云资源时状态文件拆分与协作规范

用 Terraform 管理云资源时状态文件拆分与协作规范 Terraform 这玩意儿,一个人用的时候挺爽,apply 一敲,资源就起来了;一旦变成多人协作,最先出问题的往往不是模块写得烂,而是 state 文件没管好。我见过一个 state 里塞了网络、数据库、K8s、监控、IAM 的,plan 一次要等好几分钟,两个人同时改还得抢锁,最离谱的是有次误删了一个安全组,结果半个环境跟着遭殃。所以...

阅读更多

Rust 项目中错误类型转换与上下文信息的组织方式

Rust 项目中错误类型转换与上下文信息的组织方式 先说为什么开始较真这件事 最早写 Rust,我的错误处理基本就是两招:能 unwrap 就 unwrap,不能就 .maperr(|e| e.tostring())?。项目小的时候毫无问题,毕竟报错的时候日志里好歹有一行字符串。等到服务上线,半夜被叫起来看日志,看到一句 No such file or directory,然后就没了——哪个文件?...

阅读更多

大型 Monorepo 中增量构建缓存策略与常见问题

大型 Monorepo 中增量构建缓存策略与常见问题 前阵子我们一个 Monorepo 的 CI 时间突然从 40 多分钟掉到了 8 分钟,大家一开始还挺开心,结果某次发版后首页直接白屏。查了半天,发现是构建缓存命中了,但缓存里的 NEXTPUBLICAPIURL 还是旧环境的值。从那以后我就明白一件事:增量构建缓存最难的从来不是“开个缓存”,而是你到底能不能说清楚,什么变了、什么没变、什么输出还...

阅读更多
未在播放