歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

JQroups組播通信和掉線檢測

最近在使用JQroups做多用戶的組播通信程序,發現當超過兩個用戶連接上的時候,會出現如下錯誤:

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

如下打印日志信息

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

after 2000ms missing acks from -

我的協議配置主體如下

<UDP ip_mcast="true"
    ...../>
<FD timeout=”3000” max_tries=”1”/>


這麼配置的初衷是:

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

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

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

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

是否使用UDP協議

是否使用多播

是否增加FD檢測

是否發生掉線

成員斷線判斷是否及時

未知(因為掉線了)

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

這也正是我目前的配置文件中使用的方式。http://www.linuxidc.com

如何解決這個問題呢?

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

根據以上表格和上面列出來的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通道。等待下次的連接。

這樣的話,即可以解決掉線及時判斷的問題,又能夠保證數據量的最小化和網絡的穩定性。

Copyright © Linux教程網 All Rights Reserved