feat: 配置列表分页与钉钉机器人分钟级排队限流

统一 sources/templates/channels/rules 列表为分页响应,避免配置增多时全量返回;按钉钉 access_token 限制每分钟发送并在超限时等待下一分钟,降低触发官方封禁风险。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-10 00:34:26 +08:00
parent 009694fee7
commit 39f3774940
27 changed files with 1447 additions and 60 deletions
+11 -1
View File
@@ -105,9 +105,19 @@ func main() {
matcher := engine.NewMatcher(st, redisCache)
renderer := engine.NewRenderer()
// DingTalk per-robot rate limit (queue/wait when over 18/min by default)
var dingtalkLimiter *adapter.DingTalkLimiter
limitPerMin := cfg.RateLimit.DingTalkPerMin
if redisCache != nil {
dingtalkLimiter = adapter.NewDingTalkLimiter(redisCache, limitPerMin)
} else {
dingtalkLimiter = adapter.NewMemoryDingTalkLimiter(limitPerMin)
slog.Warn("dingtalk rate limit using in-memory store (single instance only)")
}
// Build sender factory
senderFactory := func(channelType string) (adapter.ChannelSender, error) {
return adapter.NewSender(channelType, &cfg.SMTP)
return adapter.NewSender(channelType, &cfg.SMTP, dingtalkLimiter)
}
router := engine.NewRouter(st, redisCache, senderFactory)