概述
在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个线程并行执行。