Akka (.net)集群与远程节点:Disassociated异常

3

我正在使用Akka (.NET)尝试实现一个简单的集群用例。

  1. 集群 - 用于节点上/下事件。
  2. 远程 - 用于向特定节点发送消息。

有两个角色:主节点监听集群事件,从节点连接到集群。

Address address = new Address("akka.tcp", "ClusterSystem", "master", 8080);
cluster.Join(address);

当接收到ClusterEvent.MemberUp消息时,主节点会创建actor链接:
ClusterEvent.MemberUp up = message as ClusterEvent.MemberUp;
ActorSelection nodeActor = system.ActorSelection(up.Member.Address + "/user/slave_0");

向此演员发送消息会导致错误:


与远程系统akka.tcp://ClusterSystem@slave:8090的关联失败;地址现在被禁用5000毫秒。原因是:[已取消关联]


主配置:

    akka {
        actor {
            provider = ""Akka.Cluster.ClusterActorRefProvider, Akka.Cluster""
        }

        remote {
            helios.tcp {
                port = 8080
                hostname = master
                bind-hostname = master
                bind-port = 8080
                send-buffer-size = 512000b
                receive-buffer-size = 512000b
                maximum-frame-size = 1024000b
                tcp-keepalive = on
            }
        }
        cluster{
            failure-detector {
                heartbeat - interval = 10 s
            }
            auto-down-unreachable-after = 10s
            gossip-interval = 5s
        }
        stdout-loglevel = DEBUG
        loglevel = DEBUG

        debug {{  
            receive = on 
            autoreceive = on
            lifecycle = on
            event-stream = on
            unhandled = on
        }}
    }

从节点配置:

akka {
        actor {
            provider = ""Akka.Cluster.ClusterActorRefProvider, Akka.Cluster""
        }

    remote {
        helios.tcp {
            port = 8090
            hostname = slave
            bind-hostname = slave
            bind-port = 8090
            send-buffer-size = 512000b
            receive-buffer-size = 512000b
            maximum-frame-size = 1024000b
            tcp-keepalive = on
        }
    }
    cluster{
        failure-detector {
            heartbeat - interval = 10 s
        }
        auto-down-unreachable-after = 10s
        gossip-interval = 5s
    }
    stdout-loglevel = DEBUG
    loglevel = DEBUG

    debug {{  
        receive = on 
        autoreceive = on
        lifecycle = on
        event-stream = on
        unhandled = on
    }}

}

那么你是在交替使用Akka.Cluster和Akka.Remote吗?也就是说,使用Remote连接不属于集群的节点? - Aaronontheweb
不,所有节点都是集群的一部分。我需要为集群中的每个节点提供RPC方式。 除了actorRef.Tell()之外,是否有其他发送消息到特定节点的方法? - qrux
1个回答

3

以下是您的问题:

cluster{
            failure-detector {
                heartbeat - interval = 10 s
            }
            auto-down-unreachable-after = 10s
            gossip-interval = 5s
        }

heartbeat-interval和auto-down-unreachable-after是相同的持续时间 - 因此,您的节点几乎总会在10秒后自动取消关联,因为您正在押注一个故障检测器可能失去的竞争条件。

auto-down-unreachable-after是一个危险的设置 - 不要使用它。否则你会遇到脑裂或更糟的情况。

并确保您的故障检测器间隔始终低于您的自动取消关联间隔。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接