fwddbot

fwddbot

按 $request_uri 版本前缀配置 Nginx add_header 实现灰度流量标记

灰度发布时,后端服务往往需要知道「这个请求是不是灰度流量」,才能决定走新逻辑还是老逻辑。最省事的入口标记点就在 Nginx:在反向代理层解析 $request_uri,按版本前缀(例如 /v2/、/beta/)打上响应头,让下游网关、应用、甚至前端调试面板都能看到流量归属。本文解决三个具体问题:怎么用 map 稳定地从前缀推导标记、add_header 在哪

awk 结合 NR 从 journalctl 导出日志中截取指定时间窗口

把线上故障时间点定位到分钟级之后,多数人第一反应是翻 journalctl -u,但真正到复盘、提交工单、给外部同事看的时候,往往需要把「某个服务在 14:05 到 14:20 之间的全部日志」导出成一个文件。问题在于:日志导出后可能存成 app.log、app.log.1,也可能是别人从别的机器 journalctl --since ... --until

唯一索引与普通索引在 INSERT 冲突时的加锁范围差异

面试里问「唯一索引和普通索引有什么区别」,多数人能答出「唯一索引不允许重复值、查询能提前终止」。但把它和 INSERT 冲突放在一起问,能答清楚的人就少了:同样是一条 INSERT 撞上已存在的键值,唯一索引下失败的那条语句会留下间隙锁,普通索引下(如果这个索引上还有唯一约束在别的列、或者干脆是二级普通索引下的重复插入)锁的表现完全不同;更常见的是 INSE

Go 接口值为空与方法为空的判定陷阱及 reflect 检测方式

先看一段能在面试现场直接把人问住的代码:一个函数接收 error 参数,调用方传入一个 *MyError 类型的 nil 指针,函数内部用 if err != nil 判空,结果判断成立,随后调用 err.Error() 触发 panic。这段代码的诡异之处在于:明明传进来的是 nil,判空却不生效。这不是编译器的 bug,也不是运行时抽风,而是 Go 接口

面试题:Integer 在高频范围之外为什么每轮会重置为 MaxValue

这道题来自一次真实面试的追问现场:面试官给了一段多轮循环里对 Integer 做自增的代码,问「为什么超出缓存范围之后,每一轮拿到的值都是 Integer.MAX_VALUE,而不是继续往上加」。很多候选人第一反应是「Integer 是不可变类,所以加不上去」,这个回答只能算对了一半,因为不可变只会导致「原对象不变、返回新对象」,不会导致「回退到最大值」。真

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

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

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

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