在高并发、大流量的访问系统时,如果不采取适当的系统过载保护策略,可能会导致系统崩溃。那么,系统过载保护有哪些呢?
通常有:
漏桶算法,例如Google Guava
信号量控制,例如jdk原生自带的Semaphore
通过这些算法,可有效过滤过量的请求量,阻挡一部分请求流量,来保证大部分人群能继续使用系统。
这里主要示例下Semaphore的使用demo,代码如下:
/** * * @description: 过载保护机制之信号量的控制 * @from ityuan.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使用时,需要对系统性能有足够了解,且参数配置得当,否则可能得不偿失。