2013-03-15 41 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/