2010-12-09 72 views
0

我一直在閱讀關於舞臺事件驅動架構(SEDA)和異步I/O的概念。我遇到過幾個人在討論如何實現SEDA來處理HTTP請求。例如:Servlet容器中的分步異步處理?

  • Web服務器接收客戶端HTTP請求。
  • 請求被放置到隊列
  • 一,消費者的數量有限,拾取從隊列請求
  • 請求被處理時,通過典型的MVC架構(例如彈簧MVC)
  • 響應被髮送也許回到客戶端

這樣做的動機被描述爲能夠控制來自客戶端的負載 - 也就是說,它將比在接受它的同一線程中處理請求要好得多。一旦請求排隊,提取請求的線程立即可用來接受另一個請求。

當然,這種類型的模型或者類似的東西已經在servlet容器中實現了,例如Tomcat,Jetty?我一直在做的閱讀幾乎意味着這樣的容器沒有實現這種方法,因此在高流量環境中的可伸縮性方面會有問題。

任何人都可以爲我清除此事嗎?

回答

0

是的,你是正確的,大多數現代化的Servlet容器將'排隊'請求分派到有限數量的實際進行處理的線程,這與SEDA類似。

但是,當然,一個標準的HTTP請求並不是真的放在物理隊列上(因爲任務/請求將在SEDA中),而是直到服務器準備好纔會接受用戶連接(請求)處理它(或直到它被拒絕),並且這是關鍵的差異,因爲用戶不得不等待連接被接受然後處理 - 這同樣發生在同步。 SEDA的一個關鍵特性是請求處理通常是異步即,您將任務分派到隊列中,然後忘記它,可能會在一段時間後通知其完成。

無論如何,在Tomcat中可以調整acceptCount and maxThreads控制多少requets是「排隊」服務器拒絕新的傳入連接之前,又有多少被同時處理。較新的服務器將允許您異步處理請求,AJAX/Comet風格。