某投行日志记录解决方案二之日志异步落盘: 自定义注解+反射+AOP+异步多线程,实现高并发场景下的统一日志治理方案
一句话总结
自定义注解+反射+AOP+异步多线程
。
背景
在已经实现风控平台日志追踪实战解决方案的情况下,我们发现在关键操作节点(如交易提交、风控拦截),存在以下问题:
- 性能瓶颈突出:同步日志写入使核心交易接口RT增加200-300ms,QPS从2000骤降至800
- 可维护性差:日志格式不统一,关键字段缺失率达30%,审计追溯困难
- 对账困难:当出现节点数据异常,难快速定位问题
为此,我们更细粒度的统一日志记录表,实现高性能、低侵入的日志异步落盘。
架构设计
1. 整体架构
核心实现难点与解决方案
1. 零侵入日志采集
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OperationLog {
String bizType(); // 交易类型代码
String operation();// 操作描述
boolean saveParams() default true; // 是否记录入参
}
2. 高性能AOP切面
@Aspect
@Component
public class OperationLogAspect {
@Around("@annotation(operationLog)")
public Object around(ProceedingJoinPoint pjp, OperationLog operationLog) {
// 反射获取方法元数据
MethodSignature signature = (MethodSignature) pjp.getSignature();
Object result = pjp.proceed();
// 异步记录日志
AsyncLogManager.submitLogTask(() -> {
LogContext context = buildContext(pjp, operationLog);
logService.save(context);
});
return result;
}
}
3. 批量插入优化
INSERT INTO operation_log
(user_id,operation,params,result)
VALUES
(?,?,?,?),
(?,?,?,?),
...
ON DUPLICATE KEY UPDATE retry_count=retry_count+1
实施效果(AB实验对比)
指标 | 同步方案 | 异步方案 | 提升比例 |
---|---|---|---|
平均RT | 235ms | 182ms | ↓22.5% |
最大QPS | 1,200 | 4,800 | ↑300% |
CPU使用率 | 85% | 62% | ↓27% |
日志丢失率 | - | 0.0023% | <0.01% |