簡體   English   中英

如何實現一個簡單的循環負載均衡器

[英]how to implement a simple round-robin load balancer

我想實現一個簡單的循環負載均衡器,我希望'getServer'方法是線程安全的:

private static int[] servers = new int[]{0,1,2};


private static int SERVER_INDEX = 0;

//not fast enough?
public synchronized static int getServer() {
    SERVER_INDEX++;
    if (SERVER_INDEX >= servers.length - 1) {
        SERVER_INDEX = 0;
    }
    return servers[SERVER_INDEX];
}


private static AtomicInteger SERVER_INDEX_2 = new AtomicInteger(0);

//not thread-safe and will get Exception
public static int getServer2() {
    int index = SERVER_INDEX_2.getAndIncrement();
    if (index >= servers.length - 1) {
        SERVER_INDEX_2.set(0);
    }
    return servers[index]; //ERROR! arrayIndexOutOfRange
}



private static AtomicLong SERVER_INDEX_3 = new AtomicLong(0);

//thread-safe but...
public static int getServer3() {
    long longIndex = SERVER_INDEX_3.getAndIncrement();
    long index = longIndex % servers.length;
    int intIndex = (int)index;
    return servers[intIndex]; //May overflow someday! 'intIndex can be negative'...
}

我認為以上都不夠好。 有一種簡單而優雅的方法嗎?

在Java 8中,您可以使用getAndAccumulate ,如下所示:

private static AtomicInteger ind = new AtomicInteger(0);

public static int getServer() {
    return servers[ind.getAndAccumulate(servers.length, (cur, n)->cur >= n-1 ? 0 : cur+1)];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM