并发之Semaphore信号量限流操作

Java并发之Semaphore信号量限流使用

信号量Semaphore非常适合高并发访问,一般新系统上线前要预估访问量大小,当然评估值不能过大,也不能过小。过大,会导致浪费系统资源,太小,如果遇到峰值,容易压垮系统!

相关概念:
PV:

page view 页面总访问量,每刷新一次记录一次。

UV:

unique view 客户端主机访问,指一天内相同IP的访问记为1次。

QPS:

query per second,即每秒访问量。qps很大程度上代表了系统的繁忙度,没次请求可能存在多次的磁盘io,网络请求,多个cpu时间片,一旦qps超过了预先设置的阀值,可以考量扩容增加服务器,避免访问量过大导致的宕机。

RT:

response time,每次请求的响应时间,直接决定用户体验性。

Semaphore默认底层实现:

 public Semaphore(int permits) {
        sync = new NonfairSync(permits);
    }

信号量限流,使用事例:

/**
 * @author zhanghuilong
 * @version V1.0
 * @desc 高并发之信号量限流
 * @since 2018/01/14
 */
public class StudySemaphore {

    public static void main(String[] args) {
        // 线程池
        ExecutorService executorService = Executors.newCachedThreadPool();
        //信号量,只允许 5个线程同时访问
        Semaphore semaphore = new Semaphore(5);

        //模拟客户端请求
        for (int i=0;i<20;i++){
            final long num = i;
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    try {
                        //获取许可
                        semaphore.acquire();
                        System.out.println("Accessing: " + num);
                        //模拟执行时间
                        Thread.sleep(new Random().nextInt(10000));
                        //释放
                        semaphore.release();
                        //打印释放
                        System.out.println("Release...");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }

        try {
            Thread.sleep(10);
            System.out.println("执行完毕!");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //退出线程池
        executorService.shutdown();
    }

}

输出result:
并发之Semaphore信号量限流操作_第1张图片

qps预估量:

一般预估是有开发测试运维同学一起评估。采用8/2原则。即80%的请求访问在20%的时间内到达。此时根据系统pv测算出qps值
峰值qps=(总Pv * 80%)/(60*60*24*20%)。
然后再将峰值qps/单台能承受的最高qps,就是需要的机器数量。
机器数= 总峰值pqs/压测单台机子极限qps

你可能感兴趣的:(并发编程,+,实战案例)