本文是根据开涛的博客 聊聊高并发系统之限流特技-1 整理而成,自学笔记第二篇
目录
1.系统限流实践 - 理论篇
2.系统限流实践 - 应用限流
3.系统限流实践 - 分布式限流
4.系统限流实践 - 接入层限流(上)
5.系统限流实践 - 接入层限流(下*完结)
开篇
上篇学习了限流的基本知识(传送门),接下来学习一下应用限流的方法
应用级限流
针对容器限制总并发/连接/请求数
通过对容器进行配置,限制TPS/QPS阀值,防止大量请求涌入击垮系统。
如果你使用过Tomcat,其Connector 其中一种配置有如下几个参数:
acceptCount:如果Tomcat的线程都忙于响应,新来的连接会进入队列排队,如果超出排队大小,则拒绝连接;
maxConnections:瞬时最大连接数,超出的会排队等待;
maxThreads:Tomcat能启动用来处理请求的最大线程数,如果请求处理量一直远远大于最大线程数则可能会僵死
详细的配置请参考官方文档。另外如Mysql(如max_connections)、Redis(如tcp-backlog)都会有类似的限制连接数的配置
针对接口进行并发控制
如果担心接口某个时刻并发量过大了,可以细粒度地限制每个接口的总并发/请求数
可以使用Java得Atomic来实现
public class SimpleLimit {
private AtomicInteger requestCount;
public void doRequest(String threadName) {
try {
if (requestCount.decrementAndGet() < 0) {
System.out.println(threadName + ":请求过多,请稍后再尝试");
}else {
System.out.println(threadName + ":您的请求已受理");
}
} finally {
requestCount.incrementAndGet();
}
}
......
}
测试代码
public static void main(String[] args) throws InterruptedException, IOException {
final SimpleLimit simpleLimit = new SimpleLimit();
final CountDownLatch latch = new CountDownLatch(1); //保证线程同一时刻start
simpleLimit.requestCount = new AtomicInteger(10);
for (int i = 0; i < 50; i++) {
final int finalI = i;
Thread t = new Thread(new