论坛首页 编程语言技术论坛

JGroups TCP 发现机制解读

浏览 1688 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-05-16  

jgroups创建一个channel需要创建一个协议栈,协议栈的底层是传输协议,如果使用TCP的话,它的发现机制和心跳是怎么实现的呢?

 

首先,TCP启动的时候会启动一个SocketServer bind到一个特定的地址然后accept:ConnectionAcceptor。jgroups会给每个TCP socketServer创建一个ConnectionMap<ipAddress->TCPConnection>,当accept到一个连接之后会创建一个TCPConnection对象put进这个Map。(TCPConnection对象用于读写数据)

 

心跳线程是一个timer,会在member list里面轮询去连接每个member的SocketServer,并尝试建立连接。如果失败,意味着这个member还没有加入集群,如果成功,则放入上述的TCPConnectionMap里面,并且会把当前的SocketServer的地址发送过去。

 

这里有个问题:当两个节点相互发现的时候,会建立两条连接吗?

答案会,但最终只会保留一条连接。

jgroups有一个锁,在锁里面处理创建和put操作。

 

accept线程如果accept到一个连接,先读取address,发现TCPConnectionMap里面已经有这个address对应的连接了,就会比较一下当前节点和对方节点bind的地址,当peer_addr>local_addr时,使用accept到的这个连接替换原来的(我主动connect的)连接,并把原来的连接close掉。  这些操作在锁中进行,保证不会在消息发送的过程中半路把连接close掉了。

 

TCP连接总是一方accept,一方connect,是非对等的,而集群节点之间的发现是对等的。

 

上面的设计解决了非对等(TCP)的情况下,以对等的方式发现成员的问题。

 

用UDP multicast方式的发现是对等的:每个member启动的时候(包括间隔心跳),向设定的multicast group发送消息:I'm alive。所有成员都会收到这个消息,然后就知道这个member加入了集群(或者一直处于alive状态)

 

 

论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics