Java JUC工具类--Semaphore

Semaphore

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

相关概念

  • PV(page view)网站的总访问量,页面浏览量或点击量,用户每刷新一次就会被记录一次
  • UV(unique Visitor)访问网站的一台电脑客户端为一个访客。一般来讲时间上以00:00-24:00之内相同ip的客户端只记录。
  • QPS(query per second)即每秒查询数,qps很大程度上代表了系统业务上的繁忙程度,每次请求的背后,可能对应着多次磁盘I/O,多次网络请求,多个cpu时间片等。我们通过qps可以非常直观的了解当前系统业务情况,一旦当前qps超过所设定的预警阀值,可以考虑增加机器对集群扩容,以免压力过大导致宕机,可以根据前期的压力测试得到估值,在结合后期综合运维情况,估算出阀值
  • RT(response time)请求的响应时间,这个指标非常关键,直接说明前端用户的体验,任何系统设计师都想降低rt时间。
  • 当然还涉及cpu、内存、网络、磁盘等情况,更细节的问题很多,如select、update、delete/ps等数据库层面的统计。
  • 容量评估:一般来说通过开发、运维、测试、以及业务等相关人员,综合出系统的一系列阀值,然后我们根据关键阀值如qps、rt等,对系统进行有效的变更
  • 一般来讲,我们进行多轮压力测试以后,可以对系统进行峰值评估,采用所谓的80/20原则,即80%的访问请求将在20%的时间内达到。这样我们可以根据系统对应的PV计算出峰值qps
  • 峰值qps= (总PV × 80%)/ (60 × 60 × 24 × 20%) 然后在将总的峰值qps除以单台机器所能承受的最高的qps值,就是所需要机器的数量:机器数 = 总的峰值qps / 压测得出的单机极限qps
  • 当然不排除系统在上线前进行大型促销活动,或者双十一、双十二热点事件、遭受到DDos攻击等情况,系统的开发和运维人员急需要了解当前系统运行的状态和负载情况,一般都会有后台系统去维护

代码示例

package com.example.core.juc;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class UseSemaphore {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(20);//定义20个线程
        Semaphore semaphore = new Semaphore(5);//每次只容许5个线程进行操作,进行限流
        for(int index = 1;index <= 20; index++){
            final int token = index;
            Runnable run = new Runnable() {
                @Override
                public void run() {
                    try{
                        semaphore.acquire();
                        //进行相关的业务操作
                        System.out.println("获得许可操作:"+token);
                        long sleepTime = (long)(Math.random() * 10000);
                        Thread.sleep(sleepTime);
                    }catch(InterruptedException e){
                        e.printStackTrace();
                    }finally{
                        semaphore.release();
                    }
                }
            };
            executorService.execute(run);
        }

//        semaphore.getQueueLength();//取得等待许可的线程个数
        executorService.shutdown();
    }
}
/*
获得许可操作:5
获得许可操作:2
获得许可操作:1
获得许可操作:4
获得许可操作:3
获得许可操作:8
获得许可操作:9
获得许可操作:6
获得许可操作:7
获得许可操作:10
获得许可操作:11
获得许可操作:12
获得许可操作:13
获得许可操作:14
获得许可操作:15
获得许可操作:16
获得许可操作:17
获得许可操作:18
获得许可操作:19
获得许可操作:20
 */
发布了53 篇原创文章 · 获赞 1 · 访问量 1113

猜你喜欢

转载自blog.csdn.net/CHYabc123456hh/article/details/104731705
今日推荐