并发之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
相关文章推荐
- Java并发-类库新组件 - Semaphore 理解:计数信号量
- 【Java并发编程】之二十三:并发新特性—信号量Semaphore(含代码)(r)
- 【Java并发编程】之二十三:并发新特性—信号量Semaphore(含代码)
- 线程池ExecutorService 中并发数的(引入信号量Semaphore)控制执行
- Driver:内核的竞态和并发:中断屏蔽、原子操作、自旋锁、信号量
- 【多线程_并发工具】 信号量_Semaphore
- 11.python并发入门(part6 Semaphore信号量)
- Java并发系列3--信号量Semaphore
- 并发中的信号量Semaphore
- 【Java并发编程】之二十三:并发新特性—信号量Semaphore(含代码)
- 利用GCD信号量(dispatch_semaphore)控制并发
- 【Java并发编程】:并发新特性—信号量Semaphore(含代码)
- 并发新特性—信号量 Semaphore
- java并发编程学习:用 Semaphore (信号量)控制并发资源
- 第二十三篇:并发新特性—信号量Semaphore(含代码)
- java并发信号量Semaphore
- iOS --- GCD 信号量控制并发 (dispatch_semaphore)
- GCD 信号量控制并发 (dispatch_semaphore)
- JDK并发包---(7)允许多个线程同时访问的:信号量(Semaphore)
- java 并发工具包 -信号量 Semaphore