이장을 통해 알수 있는것
- 라우터와 라우티의 차이
- 그룹과 풀의 차이
- 여러 라우터를 사용하여 분산처리에 사용
프린터의 확장
앞장에서 프린터 1대는 프린터 요청을 큐에 담고, 자체 큐를 이용하여 순차적인 처리를 하였습니다.
여기서 프린터의 속도를 올리려면, 프린터의 하드웨어가 좋아서 초당 출력 능력이 좋으면 됩니다. (스케일업)
하지만 이러한 스케일업에는 제약이 있습니다. 저렴한 프린터 3대를 두어 나눠처리하는것이 효율적일수 있으며
여기에 들이는 개발 비용및 난이도가 거의 없다고 하면 선택될수 있습니다.
- 라우터 : 분배를 담당하는 경로
- 라우티 : 라우터에 연결된 , 하나의 인스턴스
- 라운드 로빈 : 요청에대해 순차적인 분배 처리
성능 확장 코드구현
actor.deployment { /printer-pool { router = round-robin-pool nr-of-instances = 5 } } AkkaLoad.RegisterActor( "printer", actorSystem.ActorOf(actorSystem.ActorOf(Props.Create<PrinterActor>() .WithRouter(FromConfig.Instance).WithDispatcher("custom-task-dispatcher"), //.WithRouter(new RoundRobinPool(5)), "printer-pool" ));
이러한 단일 프린터(액터)를 5로 스케일 아웃하는 방법은 간단합니다. 단일 액터 생성옵션에 단지 풀 옵션 지정만 하면 끝입니다.
위 코드에서 주석과 아닌부분의 차이는, 이러한 성능 셋팅을 코드베이스로할지? 설정화로 분리할지의 차이입니다.
성능 분배에는 다양한 Routing strategy 을 세울수 있습니다.
그룹과 풀의 차이
- POOL : 같은 액터를 묶어주는 것을 Pool 이라고 합니다.
- GROUP : 이미 생성된 액터를 묶어주는것을 Group이라고 하며, 다른 Type의 액터를 묶을수 있으며, POOL을 포함시킬수도 있습니다.
단일기능을 분산 확장하기
자신이 작성한 로컬 객체를 코드 변경없이 5배의 성능을 내게하거나 리모트로 분산처리를 되게 할수 있을까요?
답은 No이며, 스레드풀을 탑재하거나,LB를 붙여 흉내는 낼수 있지만 어쩔수없는 코드 변경이 이루어지게 되며
도메인 로직보다 더 많은 코드를 생성해야 할지도 모릅니다. 액터로 작성된 코드는,로컬에서도 객체접근이 아닌 메시지 기법을 사용하며
라우터 전략은 설정을 통해 선택 가능하기때문에 분산처리를 위해 확장이 되어도 도메인(액터)의 코드변경이 없는것이 액터모델이 가진 장점입니다.