Java系统过载保护机制之信号量的控制

在高并发、大流量的访问系统时,如果不采取适当的系统过载保护策略,可能会导致系统崩溃。那么,系统过载保护有哪些呢?

通常有:

  1. 漏桶算法,例如Google Guava

  2. 信号量控制,例如jdk原生自带的Semaphore

通过这些算法,可有效过滤过量的请求量,阻挡一部分请求流量,来保证大部分人群能继续使用系统。

这里主要示例下Semaphore的使用demo,代码如下:

/**
 * 
 * @description: 过载保护机制之信号量的控制
 * @from everycoding.com
 * @date 2018年1月7日 上午10:48:45
 */
public class ThreadSubmitTester {
    static ExecutorService cachedThreadPool = Executors.newFixedThreadPool(110);
    static Semaphore semaphore = new Semaphore(100);
    public static void main(String[] args) {
        for (int i=0;i<1000000000;i++) {
            cachedThreadPool.submit(new Runnable() {
                
                @Override
                public void run() {
                    lottery();
                }
            });
        }
    }
    
    private static void lottery() {
        try {
            if (semaphore.tryAcquire(10,TimeUnit.MILLISECONDS)) {
                System.out.println("success doing.......");
                try {
                    Thread.sleep(new Random().nextInt(300));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                semaphore.release();
            } else {
                System.out.println("fail doing.......");
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

示例含义:tryAcquire获取令牌,获取成功则可以往下进行,获取失败,则视为无效的过量请求,阻挡回去。

Semaphore使用时,需要对系统性能有足够了解,且参数配置得当,否则可能得不偿失。

用户评论