您的位置:首页 > 其它

并发之Semaphore信号量限流操作

2018-01-14 20:58 309 查看

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:



qps预估量:

一般预估是有开发测试运维同学一起评估。采用8/2原则。即80%的请求访问在20%的时间内到达。此时根据系统pv测算出qps值

峰值qps=(总Pv * 80%)/(60*60*24*20%)。

然后再将峰值qps/单台能承受的最高qps,就是需要的机器数量。

机器数= 总峰值pqs/压测单台机子极限qps
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Semaphore 并发限流 qps