2013-05-20 3 views
2

ClusterRouter 구성의 모든 경로에 메시지를 브로드 캐스트하려고합니다. 나는 이미 두 가지 대안을 시도했다. 이 하나Akka의 ClusterRouter에있는 라우트에 대한 메시지 브로드 캐스트

val workerRouter = context.actorOf(Props[ClusterRouter].withRouter(
    ClusterRouterConfig(AdaptiveLoadBalancingRouter(metrics), ClusterRouterSettings(
     totalInstances = 100, routeesPath = "/user/slave", 
     allowLocalRoutees = true, useRole = None))), name = "slaveRouter") 

    context.system.scheduler.schedule(2 seconds, 5 seconds, workerRouter, Broadcast(CapabilityRequest)) 

그리고이 하나 :

val broadcastRouter = context.actorOf(Props[ClusterRouter].withRouter(
    ClusterRouterConfig(BroadcastRouter(Nil), ClusterRouterSettings(
     totalInstances = 100, routeesPath = "/user/slave", 
     allowLocalRoutees = true, useRole = None))), name = "slaveRouter") 

    context.system.scheduler.schedule(2 seconds, 5 seconds, broadcastRouter, CapabilityRequest) 

그러나 그들 모두

slaves 중 하나만 메시지가 나타납니다. 생각? ,

{ 
    case (sender, message) ⇒ 
    message match { 
     case Broadcast(msg) ⇒ toAll(sender, routeeProvider.routees) 
     case msg   ⇒ List(Destination(sender, getNext())) 
    } 
} 
+0

메일 링리스트에서 묻는 질문 : 메시지를 보낼 때 클러스터에 실제로 구성원이 두 명 있다는 증거를 제시 할 수 있습니까? –

+0

전체 코드를 제공 할 수는 있지만 그래도 RoundRobinRouter가 모든 멤버에게 메시지를 보내고 (ii) 네트워크의 모든 구성원을 반복하는 "수동"브로드 캐스트가 작동하는 것 같습니다. –

답변

2

를 첫 번째 예에서 : 나는 첫 번째 시도가 일을해야 생각하는 이유를 위해


하나가 Route 만들 때 AdaptiveLoadBalancingRouterLike 특성에, AdaptiveLoadBalancingRounter.scala보고있다, 이해하기 당신은 오직 하나의 루트로 보낼 라우터를 사용하고 있습니다. 내가 읽은 문서에서이 라우터는 다른 노드에서 사용 가능한 메트릭을 사용하여 가장 강렬하게 보이지 않는 노드를 선택하고 해당 노드에있는 경로에 메시지를 보냅니다. 나는 당신이이 설치를 위해보고있는 행동이 기대된다고 생각합니다.

두 번째 예에서는 클러스터 된 환경에서 BraodcastRouter을 사용하는 것에 대한 문서에서 아무 것도 보지 못했기 때문에이 방법이 지원되는지 잘 모르겠습니다. 그런데, 내 생각 엔 비어있는 경로 목록 (Nil)을 가지고 BraodcastRouter을 만드는 것이 당신이 보는 행동의 원인이되는 것입니다. 그걸 BroadcastRouter(100)으로 변경하면 다른 동작이 나타날 수 있습니다. 그러나 다시, 나는 (문서의 예제가 없다는 것을 기반으로) BroadcastRouter을 사용하는 것이 지원된다고 (그리고 나는 틀릴 수도 있음) 생각하지 않는다.

클러스터에 브로드 캐스트 유형 라우터가 필요한 이유를 이해할 수 있도록 사용 사례를 좀 더 설명 할 수 있습니까?

편집

FWIW, 나는 다음과 같은 코드로 작업하는 일이있어. 첫째, 구성 :

akka { 
    actor { 
    provider = "akka.cluster.ClusterActorRefProvider" 
    } 
    remote { 
    transport = "akka.remote.netty.NettyRemoteTransport" 
    log-remote-lifecycle-events = off 
    netty { 
     hostname = "127.0.0.1" 
     port = 0 
    } 
    } 

    cluster { 
    min-nr-of-members = 2 
    seed-nodes = [ 
     "akka://[email protected]:2551", 
     "akka://[email protected]:2552"] 

    auto-down = on 
    } 
} 

그런 다음, 나는 다음과 같은 코드를 사용하여 두 개의 노드 (2552의 다른 2551에 하나)를 시작 :

object ClusterNode { 

    def main(args: Array[String]): Unit = { 

    // Override the configuration of the port 
    // when specified as program argument 
    if (args.nonEmpty) System.setProperty("akka.remote.netty.port", args(0)) 


    // Create an Akka system 
    val system = ActorSystem("ClusterSystem") 
    val clusterListener = system.actorOf(Props(new Actor with ActorLogging { 
     def receive = { 
     case state: CurrentClusterState => 
      log.info("Current members: {}", state.members) 
     case MemberJoined(member) => 
      log.info("Member joined: {}", member) 
     case MemberUp(member) => 
      log.info("Member is Up: {}", member) 
     case UnreachableMember(member) => 
      log.info("Member detected as unreachable: {}", member) 
     case _: ClusterDomainEvent => // ignore 

     } 
    }), name = "clusterListener") 

    Cluster(system).subscribe(clusterListener, classOf[ClusterDomainEvent])  
    } 

} 

class FooActor extends Actor{ 

    override def preStart = { 
    println("Foo actor started on path: " + context.self.path) 
    } 

    def receive = { 
    case msg => println(context.self.path + " received message: " + msg) 
    } 
} 

내가 다음 3 "노드를"해고, 다음 코드를 사용하여 내 클라이언트 노드 : 메시지를 보낸 경우

object ClusterClient { 
    def main(args: Array[String]) { 
    val system = ActorSystem("ClusterSystem") 

    Cluster(system) registerOnMemberUp{ 
     val router = system.actorOf(Props[FooActor].withRouter(
     ClusterRouterConfig(AdaptiveLoadBalancingRouter(HeapMetricsSelector), 
     ClusterRouterSettings(
     totalInstances = 20, maxInstancesPerNode = 10, 
     allowLocalRoutees = false))), 
     name = "fooRouter") 

    router ! Broadcast("bar") 
    } 
    } 
} 

, 나는 그것을보고는 모두 서버 노드의 VM, VM 당 10 배우로 수신받을.

내 라우터와 라우터의 차이점은 로컬 라우트를 지정하지 않았기 때문에 maxInstancesPerNode에 대해 routeesPath을 바꿨다는 것입니다. 이게 도움이 되길 바란다.

+0

원본 게시물의 내용을 확인하십시오. 고마워. –

+0

흥미 롭습니다.나는 근원 전체를 들여다 보았고 이것이 왜 효과가 없는지에 대한 좋은 설명을 보지 못했다. 브로드 캐스트 메시지가 전송되기 전에 100 개의 슬레이브가 생성되는 것을 보시겠습니까? – cmbaxter

+0

작동 코드 샘플을 포함하여 더 많은 정보 추가 – cmbaxter

관련 문제