我的基于RESTful Spring的Web服务接收差异化的用户请求,例如Gold,Silver和Bronze,其中Gold请求具有最高优先级,Bronze最低优先级。所以我想实现一些简单类型的差异化服务配置。这可能是最简单的(我会说几乎被嘲笑)实施的策略?
如果我提供更优先的服务,我正在考虑在一段时间内阻止较低的优先级。像这样的东西
@Controller
public class MyController {
@Autowired
private MyBusinessLogic businessLogic;
private static final int GOLD=0;
private static final int SILVER=1;
private static final int BRONZE=2;
private volatile int [] count = new int[3];
@RequestMapping
public String service(@RequestBody MyRequest request) {
count[request.getType()]++;
for(int i=0; i<request.getType(); i++)
if(count[i]>0)
Thread.sleep(500);
String result = businessLogic.service(request);
count[request.getType()]--;
return result;
}
}
合理吗?或者有一些不良的副作用? 你推荐一个更好的策略吗?
答案 0 :(得分:0)
这看起来不是一个好策略。基本上当你在Controller里面时,一个线程已经被分配给你:通过调用sleep(),你当前正在持有这样的线程,阻止其他请求被提供,并限制服务器整体可以执行的并发请求数。 sleep()调用还有一个缺点就是不释放任何锁,因此这是一个潜在的并发问题。
目前我也正在为我的REST API寻找一个不错的QoS解决方案,不幸的是我无法为您提供明确的更好的答案,但如果您的服务非常安静,您可以使用加载了类似模块的Apache代理。 mod_qos(http://opensource.adnovum.ch/mod_qos/)