用 Nginx 反向代理调试 WebSocket 连接的常见配置问题
用 Nginx 反向代理调试 WebSocket 连接的常见配置问题 最近在折腾一个带实时推送的小项目,后端 WebSocket 直连一切正常,一挂到 Nginx 反向代理后面就各种抽风:要么握手直接失败,要么连上了过一分钟准断。翻了半天日志才发现,这玩意儿的坑其实就那么几个,但每一个都挺隐蔽的,不踩一遍真不知道。下面把这次踩过的坑整理一下,都是实测可用的配置,省得下次再对着报错一脸懵。 最经典的...
阅读更多用 Nginx 反向代理调试 WebSocket 连接的常见配置问题 最近在折腾一个带实时推送的小项目,后端 WebSocket 直连一切正常,一挂到 Nginx 反向代理后面就各种抽风:要么握手直接失败,要么连上了过一分钟准断。翻了半天日志才发现,这玩意儿的坑其实就那么几个,但每一个都挺隐蔽的,不踩一遍真不知道。下面把这次踩过的坑整理一下,都是实测可用的配置,省得下次再对着报错一脸懵。 最经典的...
阅读更多Go 项目中用 errgroup 并发控制处理批量请求 起因 前阵子接了个小需求:要把数据库里几千个用户的信息,挨个调一遍第三方的接口同步过去。接口单次响应大概 200ms,我第一版图省事直接 for 循环串行调,跑完一遍得七八分钟,测试的同学在旁边等着,脸都绿了。 那还不简单,起 goroutine 呗。然后我就写出了这种东西: 跑起来确实快,快到第三方直接给我限流了,返回一堆 429,中间还夹...
阅读更多在 CI 流水线中实现前端构建产物缓存以缩短流水线时间 上礼拜给项目改了两行样式,提了个 MR,结果流水线跑了十四分钟才出结果。点开日志一看,光 npm install 就啃了六分钟,npm run build 又啃了五分钟,剩下的时间全耗在上传产物和拉镜像上。每次都全量重装全量构建,代码可能就改了一行 css,属实有点离谱。然后就去搜了一圈缓存方案,结果发现大部分教程都只讲一半,教你缓存 nod...
阅读更多MySQL InnoDB 死锁案例分析与业务 SQL 优化思路 前几天半夜收到报警,订单服务一串 Deadlock found when trying to get lock 的报错,爬起来打开电脑查日志,发现是自家的定时任务和支付回调打起来了,好家伙,自己人打自己人...说实话死锁这东西平时真不常见,摊上了还是有点懵,好在最后查明白了,顺手把整个排查过程记一下,没准儿你哪天也用得上。 现象 应用...
阅读更多React 函数组件中自定义 Hook 的常见状态管理误区 前阵子把项目里获取用户信息的逻辑抽成了一个 useUser Hook,想着一次封装,到处能用,美滋滋。结果上线前测试发现,页面里两个组件显示的用户数据对不上,Network 面板里同一个接口还被请求了两次。排查了半天,才想起来一个特别基础、但就是容易忘的事:自定义 Hook 根本不是单例,每个组件调用它,都会拿到一份完全独立的状态。 下面...
阅读更多基于 OpenTelemetry 的 Node.js 服务链路追踪接入指南 前阵子线上有个下单接口偶尔慢到七八秒,把几个服务的日志翻了个遍,单看每个服务都挺正常,最后才发现是订单服务调库存服务,库存服务里又同步调了一次优惠券服务,优惠券那边躺着一个没加索引的慢查询。这种问题光靠日志是真排查不动,所以决定把几个 Node.js 服务统一接上 OpenTelemetry。过程踩了不少坑,官方文档散得到...
阅读更多为 Python 数据处理脚本编写可维护的单元测试 从一次翻车说起 上个月有个跑了小半年的数据清洗脚本突然出了问题:上游把 orderdate 这一列的格式从 2024-01-01 换成了 2024/1/1,脚本没报错,就是默默吐出一堆空值,等业务那边找过来的时候,脏数据已经进了库。排查花了一下午,改脚本只花了两分钟,这就很难受了。 痛定思痛,决定给这些脚本补上单元测试。结果一搜教程,清一色都在教...
阅读更多Spring Boot 应用中的优雅停机配置与验证方法 前阵子发版的时候直接 kill 掉了正在跑的服务,结果运营过一会儿找过来说用户下单下到一半页面直接报错,看了一眼网关日志,一堆 connection reset。仔细一想才反应过来,Spring Boot 默认的停机方式就是把内嵌的 Tomcat 直接关掉,正在处理的请求也不管了,连接说断就断,对用户来说就是操作到一半突然报错。这事儿说大不大...
阅读更多用 Docker Compose 搭建本地多服务开发环境的注意事项 最近接手了个老项目,README 里光启动本地环境就列了七八条命令:先起 MySQL,再起 Redis,跑一遍迁移脚本,改环境变量,最后还得手动往 hosts 里加一条本地域名。每次换机器或者拉新同事都要陪着重来一遍,烦得不行,索性花了个晚上用 Docker Compose 把这堆东西全塞了进去。过程不算顺利,踩了几个坑,记录一下...
阅读更多使用 PostgreSQL 部分索引优化高频查询的实践与效果对比 起因 前段时间盯 Grafana 的时候发现,有个轮询接口的响应时间从十几毫秒慢慢爬到了八百多毫秒,而且还在涨。这个接口挺重要的,每五秒被调用一次,专门用来捞待处理的消息,慢成这样,下游已经开始超时重试了。 表结构大概长这样(简化过的): 查了一下行数,四千多万行。但真正处于 pending 状态的,峰值也就几千条,剩下的全是已经发...
阅读更多