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