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通道。等待下次的链接。 这样的话,便可以解决掉线及时判断的问题,又可以保证数据量的最小化和网络的稳定性。

相关文章
相关标签/搜索