/* 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通道。等待下次的鏈接。 這樣的話,便可以解決掉線及時判斷的問題,又可以保證數據量的最小化和網絡的穩定性。