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

↓ 向下滚动

SQL Server 事务隔离级别设置不当导致的并发异常分析

SQL Server 事务隔离级别设置不当导致的并发异常分析 先说个真事儿 上个月被拉去救火,一套订单系统的对账任务每天凌晨跑,偶尔会多出几笔重复的流水,或者少算一笔。数据库那边没报错,业务那边也没报错,就是数字对不上,而且 —— 关键是 —— 复现不了。 我一开始怀疑是定时任务重跑了,翻了半天日志,没重跑。又怀疑是存储过程里游标写错了,逐行看了一遍,也挺正常。最后实在没招了,问了一句“你们这个查...

阅读更多

用 pnpm workspace 管理 TypeScript 多包项目依赖

用 pnpm workspace 管理 TypeScript 多包项目依赖 之前项目里包一多,每个包单独 npm install,改个公共包的版本,得挨个改 package.json,然后挨个 install,烦得很。后来换成 pnpm workspace,一开始没搞明白 workspace:,改完 shared 的代码,web 里死活不更新,查了半天才发现依赖版本号写死了。下面是我现在用的方式,...

阅读更多

多环境配置管理:环境变量、配置中心和文件挂载的适用场景

多环境配置管理:环境变量、配置中心和文件挂载的适用场景 前段时间帮朋友收拾一个项目,开发、测试、生产三套配置,一开始全写在 application.yml 里,改一次环境就提交一次,最后 git 历史里全是“改数据库地址”“改 redis 地址”这种提交。后来他又听说配置中心高级,差点直接上 Nacos,我赶紧拦住:就三个服务、七八个配置项,真没必要。配置管理这事儿,不是越高级越好,关键是看你的配...

阅读更多

用 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 的方案改天再单独写,不然一篇塞不下。 令牌桶:最常用的那个...

阅读更多
未在播放