Programing/Akka

Cluster Aware Router

BUST 2018. 8. 16. 22:14

Cluster Aware Router

cluster aware router
  • Cluster Node에 분배되어 있는 Actor에 대해 Route를 할수 있다
  • 직접 Actor를 Deploy(배포)를 할수도 있고, Actor를 직접 찾을수도 있다 (Look up)
  • Router의 종류에는 2가지가 있다, Group / Pool
  • application.conf를 이용하여 정의를 할수도 있고, 직접 자바 코드를 작성해서 사용할수 있다.

Group Router

  • Actor Path를 통해 Cluster Node에 있는 Actor에 대해 메시지를 보낼수 있는 Router 
  • Cluster Node에 해당되는 Path에 해당하는 Actor가 존재하지 않으면 그 Node로는 데이터가 가지 않는다.

application.conf

akka.actor.deployment {
  /statsService/workerRouter {
      router = consistent-hashing-group
      routees.paths = ["/user/statsWorker"]
      cluster {
        enabled = on
        allow-local-routees = on
        use-role = compute
      }
    }
}

 java code configuration

int totalInstances = 100;
Iterable<String> routeesPaths = Collections
  .singletonList("/user/statsWorker");
boolean allowLocalRoutees = true;
String useRole = "compute";
ActorRef workerRouter = getContext().actorOf(
  new ClusterRouterGroup(new ConsistentHashingGroup(routeesPaths),
    new ClusterRouterGroupSettings(totalInstances, routeesPaths,
      allowLocalRoutees, useRole)).props(), "workerRouter2");

Pool Router

  • Actor를 직접 Cluster Node에 배포를 하여 메시지를 보낼수 있는 Router
  • Cluster Node에 직접 Actor를 배포를 하기 때문에, Group가 달리 생성이 되지 않아도 사용할수 있다.

application.conf

akka.actor.deployment {
  /statsService/singleton/workerRouter {
      router = consistent-hashing-pool
      cluster {
        enabled = on
        max-nr-of-instances-per-node = 3
        allow-local-routees = on
        use-role = compute
      }
    }
}

java code configuration

int totalInstances = 100;

int maxInstancesPerNode = 3;

boolean allowLocalRoutees = false;

String useRole = "compute";

ActorRef workerRouter = getContext().actorOf(

  new ClusterRouterPool(new ConsistentHashingPool(0),

    new ClusterRouterPoolSettings(totalInstances, maxInstancesPerNode,

      allowLocalRoutees, useRole)).props(Props

        .create(StatsWorker.class)), "workerRouter3");