jov1
2024-11-06 11:51:56 +08:00
假设这样一个场景,你的某个业务需要调用一个第三方接口,但是第三方接口有 QPS 限制,比如 20/每秒,
但是你的服务是集群部署的,通过 guava 的令牌桶可以实现单机的 QPS 控制,比如 RateLimiter.create(20, 1, TimeUnit.SECONDS);
如果部署 3 个集群,那么 QPS 最大可能为 60/每秒,这样就超过三方接口限制。
那么这种情况可以拆分为如何将 20 合理的分配到 3 个集群上,简单点使用 xxl-job ,根据分片总数和当前分片序号,以及你需要限制的 QPS ,计算得到每个分片的大小,替换到令牌桶上就可以了。
下面这个分配总数 count 就是你程序里面要定义的 qps 了。
RateLimiter.create(count, 1, TimeUnit.SECONDS);
```
public static void main(String[] args) {
// xxl-jpb 返回集群分片信息
ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo();
int totalSize = 20; //集群自己配置总的 qps
int shardingTotal = shardingVO.getTotal(); // xxl-job 返回的当前分片总数
int shardingIndex = shardingVO.getIndex(); // xxl-job 返回的当前分片序号
int count = getShardingCount(totalSize, shardingIndex, shardingTotal);
System.out.println("分片 " + shardingIndex + " 分配数量: " + count);
}
public static int getShardingCount(int totalSize, int shardingIndex, int shardingTotal) {
int baseSize = totalSize / shardingTotal; // 每个分片的基本数量
int remainder = totalSize % shardingTotal; // 余数部分
// 前 remainder 个分片分配 baseSize + 1 个元素,之后的分片分配 baseSize 个元素
return shardingIndex < remainder ? baseSize + 1 : baseSize;
}
```