您的当前位置:首页正文

并发工具-Semaphore

来源:要发发知识网

概述

在Semaphore信号量非常适合高并发访问限制,新系统在上线之前,要对系统的访问量进行评估,当然这个值肯定不是随便拍拍脑袋就能想出来的,是经过以往的经验、数据、历年的访问量,已经推广力度进行一个合理的评估,当然评估标准不能太大也不能太小,太大的话投入的资源达不到实际效果,纯粹浪费资源,太小的话,某个时间点一个高峰值的访问量上来直接可以压垮系统。

相关概念

  • PV(page view)网站的总访问量,页面浏览量或点击量,用户每刷新一次就会被记录一次

  • UV(unique Visitor)访问网站的ip为一个访客。以00:00-24:00之内相同ip的客户端记录一次

  • QPS(query per second)即每秒查询数,qps很大程度上代表了系统业务上的繁忙程度,每次请求的背后,可能对应着多次磁盘I/O,多次网络请求,多个cpu时间片等。我们通过qps可以非常直观的了解当前系统业务情况,一旦当前qps超过所设定的预警阀值,可以考虑增加机器对集群扩容,以免压力过大导致宕机,可以根据前期的压力测试得到估值,在结合后期综合运维情况,估算出阀值

  • T(response time)请求的响应时间,这个指标非常关键,直接说明前端用户的体验,任何系统设计师都想降低rt时间

  • 一般来讲,我们进行多轮压力测试以后,可以对系统进行峰值评估,采用所谓的80/20原则,即80%的访问请求将在20%的时间内达到。这样我们可以根据系统对应的PV计算出峰值qps

  • 峰值qps= (总PV × 80%)/ (60 × 60 × 24 × 20%)

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(20);
        Semaphore semaphore = new Semaphore(5);
        for (int i = 0; i < 20; i++) {
            executorService.execute(() -> {
                try {
                    semaphore.acquire();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.err.println(Thread.currentThread().getName() + " 获取许可");
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                semaphore.release();

            });
        }
        executorService.shutdown();

    }

运行程序会发现,控制台每次打印5行,因为semaphore只允许5个线程并行执行