1、处理高并发
1.1高并发处理方案:
缓存缓存的目的是提升系统访问速度和增大系统处理容量降级降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题解决后再打开限流限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理
1、2限流方式: mq、ratelimiter
2、ratelimiter是基于令牌桶算法来做的
guava的RateLimiter使用的是令牌桶算法,也就是以固定的频率向桶中放入令牌,例如一秒钟10枚令牌,实际业务在每次响应请求之前都从桶中获取令牌,只有取到令牌的请求才会被成功响应,获取的方式有两种:阻塞等待令牌或者取不到立即返回失败

另外简单介绍漏铜算法:
请求以一定速度进入漏桶中,如果请求速度>处理请求速度则溢出,漏桶算法能强行处理请求速率。但如果在处理高并发时,突然来大量请求这种方案不合适

令牌桶代码:create():每秒创建多少令牌
tryacquire():尝试获取令牌,tryacquire():尝试获取一个令牌,如果获取不到立即返回;tryacquire(int permits, long timeout, TimeUnit unit):尝试获取permits个令牌,如果获取不到等待timeout时间
·核心算法:
package com.leolztang.sb.aop.ratelimiter;
import org.springframework.stereotype.Service;
import com.google.common.util.concurrent.RateLimiter;
@Service
public class AccessLimitService {
RateLimiter rateLimiter=RateLimiter.create(100.0);
//尝试获取令牌
public boolean tryAcquire() {
return rateLimiter.tryAcquire();
}
}
测试类:
package com.leolztang.sb.aop.ratelimiter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/limit")
public class AccessLimiterController {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(120);
@Autowired
private AccessLimitService accessLimitService;
@RequestMapping(value="/ratelimit",method = RequestMethod.GET)
@ResponseBody
public void tryForVisit() {
for(int i=0;i<200;i++) {
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
String str=visitAccess();
System.out.println("output:"+str);
}
});
}
}
public String visitAccess() {
if(accessLimitService.tryAcquire()) {
try {
Thread.sleep(2000);
}catch (InterruptedException e){
e.printStackTrace();
}
return "aceess success [" + sdf.format(new Date()) + "]";
}else {
return "aceess limit [" + sdf.format(new Date()) + "]";
}
}
}
pom文件引入guava依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
3、
来源:https://www.cnblogs.com/enhance/p/11201190.html