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

↓ 向下滚动

用 Nginx 反向代理调试 WebSocket 连接的常见配置问题

用 Nginx 反向代理调试 WebSocket 连接的常见配置问题 最近在折腾一个带实时推送的小项目,后端 WebSocket 直连一切正常,一挂到 Nginx 反向代理后面就各种抽风:要么握手直接失败,要么连上了过一分钟准断。翻了半天日志才发现,这玩意儿的坑其实就那么几个,但每一个都挺隐蔽的,不踩一遍真不知道。下面把这次踩过的坑整理一下,都是实测可用的配置,省得下次再对着报错一脸懵。 最经典的...

阅读更多

Go 项目中用 errgroup 并发控制处理批量请求

Go 项目中用 errgroup 并发控制处理批量请求 起因 前阵子接了个小需求:要把数据库里几千个用户的信息,挨个调一遍第三方的接口同步过去。接口单次响应大概 200ms,我第一版图省事直接 for 循环串行调,跑完一遍得七八分钟,测试的同学在旁边等着,脸都绿了。 那还不简单,起 goroutine 呗。然后我就写出了这种东西: 跑起来确实快,快到第三方直接给我限流了,返回一堆 429,中间还夹...

阅读更多

在 CI 流水线中实现前端构建产物缓存以缩短流水线时间

在 CI 流水线中实现前端构建产物缓存以缩短流水线时间 上礼拜给项目改了两行样式,提了个 MR,结果流水线跑了十四分钟才出结果。点开日志一看,光 npm install 就啃了六分钟,npm run build 又啃了五分钟,剩下的时间全耗在上传产物和拉镜像上。每次都全量重装全量构建,代码可能就改了一行 css,属实有点离谱。然后就去搜了一圈缓存方案,结果发现大部分教程都只讲一半,教你缓存 nod...

阅读更多

MySQL InnoDB 死锁案例分析与业务 SQL 优化思路

MySQL InnoDB 死锁案例分析与业务 SQL 优化思路 前几天半夜收到报警,订单服务一串 Deadlock found when trying to get lock 的报错,爬起来打开电脑查日志,发现是自家的定时任务和支付回调打起来了,好家伙,自己人打自己人...说实话死锁这东西平时真不常见,摊上了还是有点懵,好在最后查明白了,顺手把整个排查过程记一下,没准儿你哪天也用得上。 现象 应用...

阅读更多

React 函数组件中自定义 Hook 的常见状态管理误区

React 函数组件中自定义 Hook 的常见状态管理误区 前阵子把项目里获取用户信息的逻辑抽成了一个 useUser Hook,想着一次封装,到处能用,美滋滋。结果上线前测试发现,页面里两个组件显示的用户数据对不上,Network 面板里同一个接口还被请求了两次。排查了半天,才想起来一个特别基础、但就是容易忘的事:自定义 Hook 根本不是单例,每个组件调用它,都会拿到一份完全独立的状态。 下面...

阅读更多

基于 OpenTelemetry 的 Node.js 服务链路追踪接入指南

基于 OpenTelemetry 的 Node.js 服务链路追踪接入指南 前阵子线上有个下单接口偶尔慢到七八秒,把几个服务的日志翻了个遍,单看每个服务都挺正常,最后才发现是订单服务调库存服务,库存服务里又同步调了一次优惠券服务,优惠券那边躺着一个没加索引的慢查询。这种问题光靠日志是真排查不动,所以决定把几个 Node.js 服务统一接上 OpenTelemetry。过程踩了不少坑,官方文档散得到...

阅读更多

为 Python 数据处理脚本编写可维护的单元测试

为 Python 数据处理脚本编写可维护的单元测试 从一次翻车说起 上个月有个跑了小半年的数据清洗脚本突然出了问题:上游把 orderdate 这一列的格式从 2024-01-01 换成了 2024/1/1,脚本没报错,就是默默吐出一堆空值,等业务那边找过来的时候,脏数据已经进了库。排查花了一下午,改脚本只花了两分钟,这就很难受了。 痛定思痛,决定给这些脚本补上单元测试。结果一搜教程,清一色都在教...

阅读更多

Spring Boot 应用中的优雅停机配置与验证方法

Spring Boot 应用中的优雅停机配置与验证方法 前阵子发版的时候直接 kill 掉了正在跑的服务,结果运营过一会儿找过来说用户下单下到一半页面直接报错,看了一眼网关日志,一堆 connection reset。仔细一想才反应过来,Spring Boot 默认的停机方式就是把内嵌的 Tomcat 直接关掉,正在处理的请求也不管了,连接说断就断,对用户来说就是操作到一半突然报错。这事儿说大不大...

阅读更多

用 Docker Compose 搭建本地多服务开发环境的注意事项

用 Docker Compose 搭建本地多服务开发环境的注意事项 最近接手了个老项目,README 里光启动本地环境就列了七八条命令:先起 MySQL,再起 Redis,跑一遍迁移脚本,改环境变量,最后还得手动往 hosts 里加一条本地域名。每次换机器或者拉新同事都要陪着重来一遍,烦得不行,索性花了个晚上用 Docker Compose 把这堆东西全塞了进去。过程不算顺利,踩了几个坑,记录一下...

阅读更多

使用 PostgreSQL 部分索引优化高频查询的实践与效果对比

使用 PostgreSQL 部分索引优化高频查询的实践与效果对比 起因 前段时间盯 Grafana 的时候发现,有个轮询接口的响应时间从十几毫秒慢慢爬到了八百多毫秒,而且还在涨。这个接口挺重要的,每五秒被调用一次,专门用来捞待处理的消息,慢成这样,下游已经开始超时重试了。 表结构大概长这样(简化过的): 查了一下行数,四千多万行。但真正处于 pending 状态的,峰值也就几千条,剩下的全是已经发...

阅读更多
未在播放