host
8bda29eac3
fix: 限流清理移出请求路径,根治 rate_limit_hits 死锁
allow() 原先每请求在同一事务里 DELETE 旧行 + INSERT + COUNT,
控制台并发加载 + 双 server 下两个事务在 rate_limit_hits 表上
死锁,未捕获异常直接断连、nginx 报 502(2026-10-27 实测,
环境与链路两区同时 502 均源于此,与各自端点逻辑无关)。
结构修复:
- allow() 只做 INSERT + 窗口内 COUNT(COUNT 按 ts > now-window
过滤,过期行残留不影响计数正确性);建表/索引每实例只做一次。
- 过期行改由后台线程 sweep_rate_limit_hits() 每 60 秒清一次;
Postgres 下拿事务级 advisory lock,另一台 server 正在清时
直接跳过,清理者之间也不死锁;清理失败只记 warning。
- main() 里对 DbRateLimiter 起 sweeper 线程(内存版不需要)。
单测:allow 不再删旧行、窗口计数忽略过期行、sweep 只删过期
行、空库 sweep 不炸。
2026-10-27 05:40:30 +08:00
..
2026-10-26 16:27:42 +08:00
2026-10-26 16:47:55 +08:00
2026-10-26 01:23:21 +08:00
2026-10-26 07:13:45 +08:00
2026-10-26 15:20:02 +08:00
2026-10-27 03:33:35 +08:00
2026-10-26 03:23:06 +08:00
2026-10-26 01:32:57 +08:00
2026-10-26 10:26:21 +08:00
2026-10-26 06:46:20 +08:00
2026-10-26 06:19:01 +08:00
2026-10-26 16:11:29 +08:00
2026-10-27 03:54:48 +08:00
2026-10-26 08:39:57 +08:00
2026-10-26 01:23:21 +08:00
2026-10-26 18:41:27 +08:00
2026-10-26 16:27:42 +08:00
2026-10-26 16:27:42 +08:00
2026-10-26 01:32:57 +08:00
2026-10-26 23:51:54 +08:00
2026-10-26 07:42:14 +08:00
2026-10-26 04:16:11 +08:00
2026-10-26 03:23:06 +08:00
2026-10-26 16:47:55 +08:00
2026-10-26 15:20:02 +08:00
2026-10-27 00:05:18 +08:00
2026-10-26 17:01:47 +08:00
2026-10-26 04:16:11 +08:00
2026-10-26 03:55:07 +08:00
2026-10-27 03:05:15 +08:00
2026-10-26 04:16:11 +08:00
2026-10-26 17:31:30 +08:00
2026-10-27 03:54:48 +08:00
2026-10-27 05:40:30 +08:00
2026-10-27 01:44:53 +08:00
2026-10-26 23:17:25 +08:00
2026-10-26 18:11:12 +08:00
2026-10-26 02:46:10 +08:00
2026-10-26 17:31:30 +08:00
2026-10-26 16:47:55 +08:00
2026-10-26 06:46:20 +08:00
2026-10-26 03:55:07 +08:00
2026-10-27 04:30:43 +08:00
2026-10-27 04:40:11 +08:00
2026-10-27 04:07:54 +08:00
2026-10-27 03:17:51 +08:00
2026-10-27 01:44:53 +08:00
2026-10-27 05:18:37 +08:00
2026-10-27 02:27:15 +08:00
2026-10-26 07:24:54 +08:00
2026-10-26 01:23:21 +08:00
2026-10-26 06:46:20 +08:00
2026-10-27 02:00:09 +08:00