From f076dcd9b23a2c74d2fb99238c2307d214acaed9 Mon Sep 17 00:00:00 2001 From: hongawen <83944980@qq.com> Date: Fri, 19 Jun 2026 17:39:12 +0800 Subject: [PATCH] =?UTF-8?q?feat(retry):=20=E6=89=B9=E6=AC=A13=20=E9=99=90?= =?UTF-8?q?=E6=B5=81=E7=B1=BB=E8=87=AA=E5=8A=A8=E9=87=8D=E8=AF=95=E5=AE=88?= =?UTF-8?q?=E5=8D=AB=E8=B1=81=E5=85=8D(=E8=AE=A9=E6=97=A0=E9=99=90?= =?UTF-8?q?=E9=87=8D=E8=AF=95=E5=9C=A8=E7=94=9F=E4=BA=A7=E7=9C=9F=E6=AD=A3?= =?UTF-8?q?=E7=94=9F=E6=95=88)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 接 16974d0(I3)。Task8 核实:限流类自动重发途经 MsgPushGuardChain 的 Quota/RateLimitChecker,per-receiver 日限远小于 ~360 次/12h,会被守卫置 rate_limited/quota_exceeded 终态 → 队列记录被删 → 无限重试静默失效。 批次1/2/I3 修对了重试编排,但不豁免守卫则功能在生产仍发不出去。 方案 A+B(用户选:完全豁免 AUTO_RETRY): - A:checkAll 加 RetrySourceEnum 参,AUTO_RETRY 跳过 quota+ratelimit (blacklist 仍执行);processSendMsg 透传。重发节奏由 120s 间隔 + 12h 兜底天然封顶,无需配额墙再约束。 - B:applySendResult 加 retrySource 参,仅首发(null)累加配额/频率计数; 重发(AUTO/MANUAL)是同一条消息再投,不重复扣额。 - MANUAL_RETRY 仍受守卫检查(只豁免 AUTO)。 checkAll 全仓仅 1 调用点;applySendResult 为 impl 内部方法、2 处 this 调用, 接口签名不变。Spring 编排+Redis 副作用无 H2 脚手架,靠编译+diff+人工冒烟 验证(spec §8):RetryDecisionLogicTest 仍 6/6 绿,全模块编译通过。 Co-Authored-By: Claude Opus 4.8 (1M context) --- .../module/push/checker/MsgPushGuardChain.java | 13 ++++++++++--- .../message/MessageRecordServiceImpl.java | 16 ++++++++++------ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/msgpush-module-push/msgpush-module-push-server/src/main/java/com/njcn/msgpush/module/push/checker/MsgPushGuardChain.java b/msgpush-module-push/msgpush-module-push-server/src/main/java/com/njcn/msgpush/module/push/checker/MsgPushGuardChain.java index 7a75957..23073b9 100644 --- a/msgpush-module-push/msgpush-module-push-server/src/main/java/com/njcn/msgpush/module/push/checker/MsgPushGuardChain.java +++ b/msgpush-module-push/msgpush-module-push-server/src/main/java/com/njcn/msgpush/module/push/checker/MsgPushGuardChain.java @@ -4,6 +4,7 @@ import com.njcn.msgpush.module.push.checker.impl.BlacklistChecker; import com.njcn.msgpush.module.push.checker.impl.QuotaChecker; import com.njcn.msgpush.module.push.checker.impl.RateLimitChecker; import com.njcn.msgpush.module.push.dal.dataobject.message.MessageRecordDO; +import com.njcn.msgpush.module.push.enums.RetrySourceEnum; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -24,9 +25,15 @@ public class MsgPushGuardChain { private RateLimitChecker rateLimitChecker; - public void checkAll(List messageRecordList) { + public void checkAll(List messageRecordList, RetrySourceEnum retrySource) { + // 黑名单:首发与重发(含限流自动重试)都必须执行 blacklistChecker.check(messageRecordList); - quotaChecker.check(messageRecordList); - rateLimitChecker.check(messageRecordList); + // 配额/接收者频率:系统自动重试(限流类无限重试)完全豁免——否则会被守卫置终态、队列记录被删, + // 无限重试静默失效。重发节奏由 120s 固定间隔 + 12h 兜底天然封顶,无需配额墙再约束。 + // 首发(retrySource==null)与人工重试(MANUAL_RETRY)仍正常受这两道守卫。 + if (retrySource != RetrySourceEnum.AUTO_RETRY) { + quotaChecker.check(messageRecordList); + rateLimitChecker.check(messageRecordList); + } } } diff --git a/msgpush-module-push/msgpush-module-push-server/src/main/java/com/njcn/msgpush/module/push/service/message/MessageRecordServiceImpl.java b/msgpush-module-push/msgpush-module-push-server/src/main/java/com/njcn/msgpush/module/push/service/message/MessageRecordServiceImpl.java index d507769..5d48f0a 100644 --- a/msgpush-module-push/msgpush-module-push-server/src/main/java/com/njcn/msgpush/module/push/service/message/MessageRecordServiceImpl.java +++ b/msgpush-module-push/msgpush-module-push-server/src/main/java/com/njcn/msgpush/module/push/service/message/MessageRecordServiceImpl.java @@ -93,7 +93,7 @@ public class MessageRecordServiceImpl extends ServiceImpl processSendMsg(List messageRecordDOList, RetrySourceEnum retrySource) { - msgPushGuardChain.checkAll(messageRecordDOList); + msgPushGuardChain.checkAll(messageRecordDOList, retrySource); List resultList = new ArrayList<>(); for (MessageRecordDO messageRecordDO : messageRecordDOList) { try { @@ -131,11 +131,11 @@ public class MessageRecordServiceImpl extends ServiceImpl