分类: 功能实现

自连接加 NOT EXISTS 改写全表最大值关联取最新记录

业务里经常遇到这样一张表:设备状态流水 device_status,每台设备每上报一次就插一条记录,同一台设备会有多条历史行。报表要的却是「每台设备最新那一条」——也就是按 device_id 分组、取 reported_at 最大(或 id 最大)的那一行,并且要把这一行的完整字段(状态、温度、电量、上报人)都取出来,而不是只取一个聚合值。 很多人第一反应

context.WithCancelCause 在 Go 中传递取消原因并区分日志

服务端代码里最常见的一句日志大概是 context canceled。它出现在 gRPC handler、HTTP middleware、后台任务、数据库调用的错误分支上,几乎没有任何信息量:是客户端主动断开,是超时兜底,是服务优雅退出,还是上游逻辑判定参数非法主动放弃?这四种情况的处置方式完全不同,但日志里长得一模一样。 Go 1.20 给 context

Nginx map 指令实战:按 User-Agent 分流移动端并回写上游请求头

很多站点做移动端适配时,第一反应是改后端代码:在 Controller 里读 User-Agent,判断是不是手机,再决定跳 m. 域名还是返回不同模板。这种写法能用,但把「流量分发」这件本该由接入层处理的事塞进了业务代码,结果是每个语言、每个服务都要重复实现一遍判断逻辑,正则写得还不一致;更麻烦的是灰度阶段想临时改规则,得重新发版。 Nginx 的 map

用 HSET 加 EXPIRE NX 共置命名空间校验防止键名冲突覆盖

多业务共用一套 Redis 时,最容易出的事故不是缓存击穿,而是键名冲突导致的静默覆盖:订单服务写 order:1001,营销服务也写 order:1001,两边都不报错,只是数据隔一段时间就"莫名其妙"变一次。排查时日志干净、监控无异常,因为从 Redis 的视角看,这就是一次合法的 HSET。本文给出一套低成本方案:把命名空间的归属信息写进同一个 Has

用 tokio::time::timeout 包裹 select! 分支实现带截止时间的多路读取

在异步 Rust 里同时等待多个数据源,最直接的写法是 tokio::select!。但它有一个不太显眼的语义:select! 只负责「谁先就绪就返回谁」,不负责「等多久就不等了」。当某个分支既不返回数据也不报错——比如一个长时间静默的 WebSocket、一个对端迟迟不发心跳的 TCP 连接、一个被上游限流卡住的 HTTP body——整个 select!

用 ResizeObserver 监听容器宽度变化触发 ECharts 实例 resize 的防抖写法

图表容器宽度变化却没能触发 ECharts 重绘,是后台系统里最常见的一类「看起来没 bug 的 bug」。典型场景:左侧菜单折叠、抽屉打开、表格列拖拽、分栏拖拽器调整、浏览器窗口缩放、暗色主题切换导致 padding 变化。页面本身是响应式的,容器的 clientWidth 明明变了,但 ECharts 画布还停在旧尺寸上,表现为右侧留白、X 轴标签被裁掉

用 zoneinfo 与 tzdata 计算跨时区账单周期边界的实现方式

做跨境订阅、SaaS 按量计费或海外电商对账时,账单周期边界算错,后果不是「差一小时」这么轻。它会让一笔本应落在 5 月的扣费滑进 4 月,让月末续费在夏令时切换日重复扣款或漏扣,让 MRR 报表在 3 月和 11 月各抖一次。根因往往很简单:用 datetime.utcnow() 加减 30 天,或者用 pytz.localize() 处理了当前时间却忘了

用 embed.FS 配合 http.FS 把静态资源打进 Go 二进制并输出 Last-Modified

把前端构建产物(dist 目录)随 Go 服务一起发布时,最常见的做法是让运维额外同步一份静态目录,再用 http.FileServer(http.Dir("./dist")) 提供服务。这套方案在单机、内网、编译产物随手丢的场合能用,但一旦涉及容器镜像、多副本、跨环境发布,就会出现三类问题:镜像里漏拷静态文件导致 404;容器只读根文件系统时无法写入;多个

用 readOnlyRootFilesystem 配合 emptyDir 挂载可写临时目录的最小化配置

把 Pod 的 securityContext.readOnlyRootFilesystem 设为 true 之后,最快的反馈往往不是安全加固的成就感,而是一串启动失败:nginx 起不来、Java 进程报 /tmp 不可写、Node 应用在写日志时崩溃。原因很直接——容器根文件系统变成只读以后,所有原本"随手写到容器层"的路径都失效了,而镜像里绝大多数程序