Conan
Conan
发布于 2024-01-22 / 70 阅读
0
0

给单个接口设置QPS

Google,RateLimiter

  private RateLimiter limiter;

  @PostConstruct
  public void init() {
    limiter = RateLimiter.create(100.0);
  }

使用

// 是否触发了QPS保护
if (!limiter.tryAcquire()) {
    return Response.failure(ErrorCodeMsgEnums.OPERATION_FREQUENTLY);
}

QPS、QTS区别:

QPS:每秒查询数;【查询】
QTS:每秒事物数(处理事物数量);【更新】

拓展,如果要在RateLimiter中动态设置QPS值,比如使用Nacos配置文件形式;

@Slf4j
@Getter
@RequiredArgsConstructor
@Service
public class ShiseidoRateLimiterService {

  private final ShiseidoConfig shiseidoConfig;

  private RateLimiter rateLimiter;

  @PostConstruct
  public void init() {
    rateLimiter = RateLimiter.create(shiseidoConfig.getTodosUnfinishedQps());
  }

  @EventListener
  public void handleContextRefresh(EnvironmentChangeEvent event) {
    log.info("开始刷新待办QPS值: {}", shiseidoConfig.getTodosUnfinishedQps());
    rateLimiter.setRate(shiseidoConfig.getTodosUnfinishedQps());
  }
}

@PostConstruct:构造函数被调用,并且所有的Spring注入都以完成时,该注解方法才会执行;

@EventListener:应用内发布与监听器匹配的异步或同步事件时,该方法会被触发;

EnvironmentChangeEvent:应用程序的环境或者属性变化时,事件会被触发【如果你只关心环境的刷新,而不关心具体哪些属性变化,你可能想要监听 RefreshEvent 而不是 EnvironmentChangeEvent。】

使用:

if (!shiseidoRateLimiterService.getRateLimiter().tryAcquire()) {
   return Response.failure(ErrorCodeMsgEnums.OPERATION_FREQUENTLY);
}


评论