带有远程节点的Akka(.net)群集:解除关联的异常

带有远程节点的Akka(.net)群集:解除关联的异常,akka,akka-cluster,akka.net,Akka,Akka Cluster,Akka.net,使用akka(.net),我试图实现简单的集群用例 群集-用于节点向上/向下事件 远程-用于向特定节点发送消息 有两个参与者:侦听集群事件的主节点和连接到集群的从属节点 Address address = new Address("akka.tcp", "ClusterSystem", "master", 8080); cluster.Join(address); 当ClusterEvent.MemberUp消息被重新分配给创建参与者链接的主节点时: ClusterEvent.MemberUp

使用akka(.net),我试图实现简单的集群用例

  • 群集-用于节点向上/向下事件
  • 远程-用于向特定节点发送消息
  • 有两个参与者:侦听集群事件的主节点和连接到集群的从属节点

    Address address = new Address("akka.tcp", "ClusterSystem", "master", 8080);
    cluster.Join(address);
    
    当ClusterEvent.MemberUp消息被重新分配给创建参与者链接的主节点时:

    ClusterEvent.MemberUp up = message as ClusterEvent.MemberUp;
    ActorSelection nodeActor = system.ActorSelection(up.Member.Address + "/user/slave_0");
    
    向此参与者发送消息会导致错误:


    与远程系统akka的关联。tcp://ClusterSystem@从机: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
        }}
    
    }
    
    这是你的问题:

    cluster{
                failure-detector {
                    heartbeat - interval = 10 s
                }
                auto-down-unreachable-after = 10s
                gossip-interval = 5s
            }
    
    心跳间隔和自动关闭在相同的持续时间后不可到达-因此您的节点几乎总是在10秒后自动解除关联,因为您打赌失败检测器可能会失败的竞争条件

    自动下降后无法达到是一个危险的设置-不要使用它。你最终会导致大脑分裂或更糟


    并确保您的故障检测间隔始终低于自动停机间隔。

    那么您是否可以互换使用Akka.Cluster和Akka.Remote?例如,使用Remote连接到不属于群集的节点?不,所有节点都属于群集。我需要集群中每个节点的RPC方式。是否有其他方法将消息发送到集群的特定节点而不是actorRef.Tell()?