非法金额拦截需构建可追踪、可分级、可联动的业务信号机制:核心流规则负责判别时机与分级响应,自定义异常类负责固化现场与承载语义。

在高并发交易场景中拦截非法金额,关键不是堵住单个请求,而是让拦截动作本身成为可追踪、可分级、可联动的业务信号。核心流规则 + 自定义异常类不是两个独立模块,而是一套协同机制:流规则负责“判别时机”和“分级响应”,异常类负责“固化现场”和“承载语义”。
用核心流规则定义拦截边界
非法金额拦截不能只靠 if (amount
-
流量维度规则:同一账户 1 秒内超 5 笔金额校验请求 → 触发限流+标记可疑,不直接报错,改抛
RateLimitedAmountException -
精度与格式规则:币种为 JPY 时,金额必须为整数;USD/EUR 必须保留两位小数 → 校验失败抛
PrecisionMismatchException,快照中带currency和raw_input -
风控联动规则:该 account_id 近 1 分钟有 3 次校验失败 → 自动升级为
HighRiskAmountException,快照中含risk_score和fail_count_1m
自定义异常类必须携带流规则执行结果
异常不是错误容器,是流规则执行后的“结构化快照”。每个金额异常类都应继承统一基类,并强制注入流规则输出:
- 构造时传入
FlowRuleResult对象(含 ruleId、matched、score、triggerTime) - 重写
getErrorCode():根据规则类型返回不同码,如AMT_PRECISION_ERR、AMT_RATE_LIMITED - 提供
toAuditLog()方法:输出 JSON 化审计字段,包括trace_id、account_id、rule_chain(触发的规则路径)
在流控入口统一采集与绑定
不要等规则命中后再拼数据。应在请求进入核心流处理前,就完成上下文初始化:
- 使用 ThreadLocal 或 MDC 在网关层或 Controller 入口调用
AmountFlowContext.begin(accountId, rawAmount, currency) - 该方法自动记录时间戳、生成 trace_id、预加载账户基础属性(如默认币种、风控等级)
- 后续所有规则校验、异常抛出,均复用此上下文,确保“判、拦、记”三者现场一致
拦截后必须触发可操作的下游动作
抛出异常只是起点。真正的闭环在于让异常驱动真实动作:
- 全局处理器捕获后,若为
HighRiskAmountException,自动调用风控服务发起临时冻结 - 若为
RateLimitedAmountException,向 Redis 写入rate:acct:{id}计数器,并设置 TTL - 所有异常日志通过 Logback 的
%X{amount_snapshot}输出结构化字段,供 ELK 实时聚合分析











