轮询法是最简单、最常见的负载均衡算法之一,其实现思路也非常简单:按照事先规定的顺序依次将请求转发至后端服务器。例如,若有3台服务器,则第1个请求会被分配到第1台服务器上,第2个请求会被分配到第2台服务器上,第3个请求会被分配到第3台服务器上,第4个请求又会被分配到第1台服务器上,以此类推。 这种算法的优点是实现简单、可靠性高,但是它并没有考虑服务器的实际负载情况,导致某些服务器可能会承受过多的负载,而其他服务器则处于空闲状态。
在日常开发中我们可能会遇到服务方接口并发小的情况,比如AI的生文/图接口一个账号的并发仅有个位数,而我们的业务需求要20个并发。这时候我们可以采用轮询算法,用不同的的账号请求服务方,增加我们接口的并发。
代码
//定义一个全局计数器,每次调用累加
private static AtomicInteger atomicInteger = new AtomicInteger(0);
//定义apiKey、apiSecret列表
private static List<GlmApiKeySecret> glmApiKeySecretList = new ArrayList<>();
public GlmApiKeySecret roundRobinGlmApiKeySecret() {
glmApiKeySecretList = JSONObject.parseArray(projectMetadata.getGlmApiKeySecretList(), GlmClient.GlmApiKeySecret.class);
//获取apiKey、apiSecret数量
int count = glmApiKeySecretList.size();
//获取当前请求应该转发到哪个账号上
int currentIndex = atomicInteger.incrementAndGet() % count;
GlmApiKeySecret glmApiKeySecret = glmApiKeySecretList.get(currentIndex);
log.info("roundRobinGlmApiKeySecret请求到:apiKey为:{}的账号", glmApiKeySecret.getApiKey());
return glmApiKeySecret;
}
@Data
public static class GlmApiKeySecret {
private String apiKey;
private String apiSecret;
}