• JGroups TCP 发现机制解读


    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状态)

  • 相关阅读:
    SDK Tools Dependencies
    hibernate开发中遇到多对多的问题,可以转换为两个一对多
    利用PC 转发 模拟手机端之间socket通信
    假如你被当成精神病关进了精神病院
    通过JSONP实现完美跨域
    查看linux系统版本命令
    Eclipse+python开发环境配置
    linux chkconfig命令参数及用法详解
    Fedora 17 安装后要做的几件事:MP3,桌面定制,root登录等
    Fedora 17 配置 Nginx + Mysql + php
  • 原文地址:https://www.cnblogs.com/cwjcsu/p/8433065.html
Copyright © 2020-2023  润新知