2013-03-15 37 views
0

我的RESTful基于Spring的Web服务收到差异化的用户请求,比如金牌,银牌和铜牌,其中金牌请求具有最高优先级,铜牌最低。所以我想实现一些简单类型的差异化服务配置。这可能是最简单的(我会说几乎嘲笑)战略实施?我的REST风格的Web服务的最简单的QoS策略

我在考虑如果我服务更多的优先级时阻塞较少的优先级。像这样的东西

@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

它看起来不是一个好策略。基本上,当你在控制器内时,一个线程已经被分配给你:通过调用sleep(),你当前持有这样的线程,阻止其他请求被服务并且限制整个服务器可以执行的并发请求的数量。 sleep()调用也有不释放任何锁的缺点,所以这是一个潜在的并发问题。

目前我也在为我的REST API寻找体面的QoS解决方案,但不幸的是我无法为您提供明确的更好的答案,但是如果您的服务真的很安静,您可以使用装有模块的Apache代理像mod_qos(http://opensource.adnovum.ch/mod_qos/