2011-11-07 37 views
0

我試着去實施可用性的熱備方式,我把它記如下:EJB和熱備份

  1. 客戶端發送3名相同的請求,每個服務器(我們有3個,其實虛擬機器)
  2. 每臺服務器收到請求並對其進行處理
  3. 服務器完成後,它會ping其他服務器,如果它們已完成。
  4. 如果他是第一個完成,他會回覆,其他人不會。

所以我在製作3個同步請求時遇到了問題。這是我通常會做,從一個servlet

class Servlet_JSP_or_Something extends HttpServlet 
{ 
    doGet(HttpReq...) 
    { 
      @EJB 
      RemoteInterfaceEJB ejbclass; 
      ejbclass.doSomething() 
    } 
} 

但是,現在,我想我會做這樣的事情

class Servlet_JSP_or_Something extends HttpServlet 
{ 
    doGet(HttpReq...) 
    { 
      @EJB(name="Server1") 
      RemoteInterfaceEJB ejbclass; 
      ejbclass.doSomething() 

      @EJB(name="server2") 
      RemoteInterfaceEJB ejbclass; 
      ejbclass.doSomething() 

      @EJB(name="server3") 
      RemoteInterfaceEJB ejbclass; 
      ejbclass.doSomething() 
    } 
} 

調用一個遠程接口,但我不是這樣,如果舒爾這將工作。我甚至不知道@EJB(name =「...」)是否足夠 或如何爲在不同的虛擬機器上運行的每個不同的ejb設置名稱。

所以問題是: ¿我該如何從同一個servlet/jsp同時調用3個相同的EJB,使得EJB在不同的機器上運行?

回答

1

將請求放在隊列中,使3臺機器監聽隊列並等待結果。如果它們中的任何一個在處理過程中失敗,則該請求將返回隊列並由另外兩個之一處理。在同一請求下同時運行3個系統,並且「賽跑」取得成功聽起來充滿了危險和瘋狂。

我的意思是說,具有投票系統的航空電子設備有助於確保噴氣客機不會自發地進入大海,但大多數系統並沒有真正的可靠性負擔。他們也傾向於擁有非常大的工程預算。

所以,我會去與JMS隊列。

附錄:

隊列是由羣集管理,那麼EJB可以在自己的集羣部署(或簡單地獨立工人,他們甚至不必是EJB的,它們可以是任何東西)。這些EJB都訂閱了相同的隊列。每個bean從隊列中取出一條消息並與之一起運行。信息的採集是事務性的。如果EJB因任何原因失敗,則消息將再次在隊列中可用,準備好讓另一個EJB接受它。

JMS隊列和EJB服務器都是冗餘的,因此都不是單點故障。

今天的許多EJB服務器都可以集羣,因此只需將服務器配置到集羣並調用它即可。你的客戶代碼不會改變。

如果您對此安排不滿意,那麼您可以不使用遠程EJB調用,而是切換到Web服務,並使用(集羣)負載均衡器將服務處理程序服務器(即EJB服務器)分配流量。

沒有這解決了所有服用單一堆棧處理的冗餘在狀態共享,競爭條件,會話親緣關係,等等,等等條件時

沒有「簡單」的註釋做會出現問題這個。使用特定於您的容器的開箱即用集羣可能與您將要獲得的密切相關。

+0

問題是,這將是一個單一的失敗點,我無法承受......我的問題更具技術性:我可以使用哪種註釋或庫來調用位於不同物理位置的相同ejb – fernandohur