Jgroups組播通訊和掉線檢測

/*

http://my.oschina.net/lifj/blog/175758

*/


最近在使用Jgroups作多用戶的組播通訊程序,發現當超過兩個用戶鏈接上的時候,會出現以下錯誤:java

2000ms出現後不一會,全部終端都會所有退出廣播服務器


以下打印日誌信息:網絡

failed to collect all acks (expected=1) for viewspa

after 2000ms missing acks from -.net


個人協議配置主體以下:設計

<UDP ip_mcast="true"
     ...../>
<FD timeout=」3000」 max_tries=」1」/>日誌


這麼配置的初衷是:code

1.使用組播進行消息的傳遞,減小網絡的數據量。blog

2.同時,可以及時的對成員的斷開作判斷。(其實Jgroups也有默認檢測時間,大約是35秒)ip

可是,這麼配置的話,就會出現以上的錯誤信息。


通過屢次嘗試,下面是我總結的一個表格:

是否使用UDP協議

是否使用多播

是否增長FD檢測

是否發生掉線

成員斷線判斷是否及時

未知(由於掉線了)


也就是說:只有同時使用多播和FD檢測的時候,纔會出現掉線這樣的狀況


這也正是我目前的配置文件中使用的方式。
 

如何解決這個問題呢?

閱讀官方文檔,官網推薦使用多個通道來實現不一樣的操做。

根據以上表格和上面列出來的2點需求來看,咱們這邊也能夠這麼作:
1.建立一個通道(online),專門用於檢測成員是否掉線。
2.建立一個通道(command),專門用於發送命令和傳輸數據。

這樣的話,
1. online的配置能夠這樣設計:不使用多播,可是增長FD檢測。
    不使用多播也不會增長數據量,由於這個通道上不會發送數據,只會作掉線的判斷。
    增長FD檢測,就可以及時的知道是否已經掉線。
因此,online配置文件相似於
<UDP ip_mcast="false"
        ....../>
<FD timeout="2000" max_tries = "1"/>

2.command的配置文件能夠這樣設計:使用多播,但不增長FD檢測。
    使用多播,能夠減小網絡數據量,下降網絡阻塞的可能性。
    不用FD檢測,由於FD檢測在online中專門進行了。
因此,command配置文件相似於:
<UDP ip_mcast="true"
     ...../>
<FD />  <!-- 無需設置-->

這兩個通道配合工做:
    每次鏈接時,同時啓動online和command通道。
    好比說有這樣一個場景(雖然這個場景不是很常見):一個服務器A,一個服務器B,N個成員。N個成員的活動依賴服務器B的狀態,若是服務器B宕機了,N個成員就也應該終止活動。服務器A,B和成員,都在同一個網絡中。

在服務器B掉線的場景下:只要服務器A的online通道檢測到服務器B掉線了,服務器A就經過command通道發送命令給其餘成員,其餘成員接收到命令以後,關閉和服務器B鏈接的online通道和 command通道。等待下次的鏈接。 這樣的話,便可以解決掉線及時判斷的問題,又可以保證數據量的最小化和網絡的穩定性。

相關文章
相關標籤/搜索