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

↓ 向下滚动

微服务间调用超时、重试和熔断配置的取舍原则

微服务间调用超时、重试和熔断配置的取舍原则 上个月线上出了个事,一个挺边缘的下游服务抖了几秒钟,结果前台的一堆接口全跟着挂了,看监控请求量直接翻了快十倍,下游本来只是抖一下,硬生生被打死,雪崩了。复盘的时候发现,链路上几乎每个服务都配了“重试 3 次、超时 5 秒”,七八个服务叠在一起,一次失败瞬间就变成几十个请求砸向同一个下游,而熔断又配得特别迟钝,完全没兜住。这件事之后我把手里几个核心服务的超...

阅读更多

用 Redis 过期键与发布订阅实现简单的延迟任务队列

用 Redis 过期键与发布订阅实现简单的延迟任务队列 前阵子项目里有个需求:订单下单后 15 分钟没支付,就自动把订单关掉、库存还回去。这种典型的延迟任务场景,教科书答案是上 RabbitMQ 的死信队列,或者整个 xxl-job 之类的调度平台。但项目本来就只挂了一个 Redis,为了这么点功能再引入一个消息中间件,运维那边多半不乐意,我也嫌麻烦。后来翻 Redis 文档,发现 key 过期的...

阅读更多

Elasticsearch 索引 mapping 设计中的字段类型选择建议

Elasticsearch 索引 mapping 设计中的字段类型选择建议 前段时间帮朋友排查一个 ES 集群的问题,搜索接口动不动就超时,打开 mapping 一看,好家伙,连用户 ID、订单状态、手机号这种字段全是 text,查询要套 match,聚合直接没得做。后来新建索引把类型捋了一遍,问题基本就没了。所以说 mapping 这东西,建索引之前多花十分钟想清楚,能省后面一堆麻烦。下面是一些...

阅读更多

用 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,脚本没报错,就是默默吐出一堆空值,等业务那边找过来的时候,脏数据已经进了库。排查花了一下午,改脚本只花了两分钟,这就很难受了。 痛定思痛,决定给这些脚本补上单元测试。结果一搜教程,清一色都在教...

阅读更多
未在播放