背景

积分相当于用户的资产,往往需要当作金钱对待

设计

要求

  • 需要及时发现用户的薅羊毛行为
  • 对于异常用户需要有黑名单机制
  • 接口调用需要有相应的鉴权措施

实现

如何及时发现用户的薅羊毛行为

通过日志对用户积分使用频率、额度进行统计监控

如何预防

对每日额度进行限制,要求必须高性能

版本一:通过lua脚本实现,计算用户的每日额度,维护性较差,性能较高

版本二:直接通过多条redis命令实现

黑名单如何实现

如何拉黑用户

  1. 提供拉黑接口
  2. 拉黑时将用户昵称信息全部插入黑名单表
  3. 同时加载到缓存

如何判断拉黑

封装对应的方法级注解,拦截业务参数,在缓存中进行判断。

扩展

动态代理

目的:在不修改原始类代码的前提下,通过代理对象控制对目标对象的访问。

  1. 定义接口和实现类
  2. 实现invocationHandler
  3. 生成代理对象并调用方法
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public class Main {
    public static void main(String[] args) {
        UserService target = new UserServiceImpl();
        UserService proxy = (UserService) Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new LogInvocationHandler(target)
        );
        proxy.saveUser("张三"); // 输出增强后的日志
    }
}

有接口优先使用JDK自带,性能较好,依赖反射实现。

没有接口再使用cglib,通过ASM库生成目标类的子类,覆盖父类方法。

总结

可以进一步优化实现实时风控,通过flink+kafka实现实时的用户检测。