2014-09-22 71 views
2

不確定這個問題是否需要在另一個堆棧交換站點中提出,如果有的話請相應地遷移!備用機制 - 最佳方法?

我有三個不同類型的服務器的連接。這些可以在屬性文件中配置。

說有三個服務器:

Server1 
Server2 
Server3 

Properties文件,我已經配置如下:

ServerPref1 = Server1 
ServerPref2 = Server2 
ServerPref3 = Server3 

在代碼級別,我的回退機制如下:

private static void getServerAndConnect() { 
     try { 
      connect(Properties.ServerPref1); 
     } catch (ServerException se1) { 
      try { 
       connect(Properties.ServerPref2); 
      } catch (ServerException se2) { 
       try { 
        connect(Properties.ServerPref3); 
       } catch (ServerException se3) { 
        // Unable to connect 
       } 
      } 
     } 
    } 

connect()方法會拋出定製ServerException,如果UNAB連接到服務器。

一切按預期工作。

我的問題是:這是實現回退機制的正確方法還是最佳方法?

+1

我不知道,如果你的問題是,相對於_your requirements_在回退足夠清晰。是的,這足以連接到第一臺可用的服務器。但你如何?處理服務器B在連接到服務器後變得不可用?也許你想重新連接到服務器A然後(之前沒有)? – 2014-09-22 05:36:54

+1

如果您嘗試兩次連接到服務器,請將其從「池」中刪除,您可能需要添加更多功能。我會建議尋找ESB/Apache駱駝而不是實施你自己的解決方案 – 2014-09-22 05:40:12

回答

7

我推薦一個服務器連接列表,然後你可以使用一個循環代替嵌套,這將允許你添加更多的服務器而不需要修改代碼。

既然你已經爲每個連接單獨的屬性,沒有看到你的代碼的其餘部分,我可以提供最好是把這些領域到一個臨時目錄並遍歷這一點。

理想的情況下讓你的特性解析代碼編寫的連接到一個列表,以及所以你可以有服務器的任意數量沒有增加新的領域,以您的屬性的類。

private static void getServerAndConnect() { 
    List<ServerPref> serverPrefs = Arrays.asList(Properties.ServerPref1, Properties.ServerPref2, Properties.ServerPref3); 

    for (ServerPref serverPref : serverPrefs) { 
     try { 
      connect(serverPref); 
      // test success of connection? and break out of the loop 
      break; 
     } catch (ServerException se1) { 
      // log error and go onto next one 
     } 
    } 
} 
+0

有趣!一個循環法。並添加*服務器列表提供程序*並將服務器首選項從服務器連接邏輯中分離出來。 – watery 2014-09-24 06:09:44

0

一般方法沒問題。根據您的需求,你可以做一些改進:

有沒有總是精確三臺服務器?如果數字可以更改,請將您的服務器放在列表中,然後遍歷該列表以查找第一臺運行的服務器。

如果您希望您的工作負載更均勻地分佈在服務器上,而不是所有到達第一個服務器的連接(如果可用),請在迭代它之前隨機化服務器列表,或使用循環法。

如果經常調用getServerAndConnect()方法,請考慮記住最終使用的服務器,並在下一次首先使用該服務器,因爲概率仍然是可達的。