Page History
Akka는 기본적으로 탑레벨 아키텍쳐의 설계방식으로 Actor를 위치시키고 접근을 하며 (최상위부터 생성하여 구조화하는 방식 )
다음과같은 특성이 있습니다.
- 액터접근 : 트리구조이지만, FullName을 알고있을시 최하위 자식노드에게 직접 리모트 메시지전송이 가능합니다.
- 액터접근 : 가령 someActor의 자식에게 모두 메시지를 보내고 싶으면 someActor/* 를 할수 있습니다.
- 라우팅화 가능 : 분산처리를 위해 자식노드에게 다양한 라우팅을 지정할수 있습니다. 가령 순차적으로 분산처리 해야한다고하면 라운드 로빈으로 자식 액터 배치가 가능합니다.
- 리모트 액터 : 모든게 메시징를 통해서만 명령이 전달되며 로컬과 리모트의 차이가 없습니다.
- 클러스터 : 로컬과 리모트의 차이가 없다란것은 로컬로 개발된 액터가 약간의 코드수정으로 단일지점 병목없는 클러스터화 가능합니다.
Actor의 기본 생성과 Child Actor 생성
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
public class MyActor : ReceiveActor { private ILoggingAdapter log = Context.GetLogger(); public MyActor() { Receive<string>(message => { if (message == "createChild") { Context.ActorOf<MyActor>("myChild"); Sender.Tell("Create Child Succed:myChild"); } else { Sender.Tell("RE:" + message); } }); Receive<SomeMessage>(message => { Sender.Tell("RE:" + message.message); }); } } IActorRef myActor = actorSystem.ActorOf<MyActor>("myactor"); myActor.tell("createChild"); |
액터접근
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
var parentActor= system.ActorSelection("user/myactor"); var childActor= system.ActorSelection("user/myactor/myChild"); |
잘설계된 RestAPI의 endpoint 와 접근법이 유사합니다.
어떠한 의미에서 REST-API 설계도 Top-Level 아키텍쳐를 따른다고 볼수 있습니다. ( 상위에서 하위기능으로 분류)
작동방식에서의 차이는 REST-API는 무상태를 지향하지만, 액터의 경우 상태가 있는 서비스 설계에 더 유리합니다.
액터성능
로컬에서만 사용될때는 메모리를 사용하며 , 리모트 전송이 발생할때는 고성능 TCP프로토콜을 활용합니다.
로컬에서는 주로 멀티스레드를 관리하는 Dispatcher에 의해 액터의 성능이 결정될수 있으며
리모트에서는 고성능 TCP모듈및 , 원격컴퓨터간 데이터복원을 위한 직렬화에 영향을 받을수 있으며
컴포넌트 형태로 이것은 모두 코드변경없이 가장 빠른모듈로 손쉽게 교체가 가능합니다.
액터의 소멸과 생명주기
구조적인 설계로, 부모의 액터를 정지시키면 자식의 액터를 모두 종류후 마지막에 부모 액터가 종료가됩니다.
상속을 받은 OOP Class의 소멸 순서와도 유사합니다.
부모가 자식을 관리감독할수 있으며, 장애복구전략에 따라 자식액터를 재생성 할수 있습니다.
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
public class StartStopActor1 : ReceiveActor { private ILoggingAdapter log = Context.GetLogger(); public StartStopActor1() { Receive<string>(message => { if (message == "stop") { Context.Stop(Self); } }); } protected override void PreStart() { log.Info("first started"); Context.ActorOf<StartStopActor2>("second"); } protected override void PostStop() { log.Info("first stopped"); } } public class StartStopActor2 : ReceiveActor { private ILoggingAdapter log = Context.GetLogger(); public StartStopActor2() { Receive<string>(message => { }); } protected override void PreStart() { log.Info("second started"); } protected override void PostStop() { log.Info("second stopped"); } } IActorRef myActor = actorSystem.ActorOf<StartStopActor1 >("myactor"); myActor.Tell("stop"); //OutPut //first started //second started //second stopped //first stopped |
Supervisor을 통한 장애허용시스템
Child 액터가 장애발생시, 다양한 복구전략( 3초간 30초동안시도)을 통해 Child액터의 복구가 가능합니다.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
var supervisor = BackoffSupervisor.Props( Backoff.OnFailure( childProps, childName: "supervised-actor", minBackoff: TimeSpan.FromSeconds(3), maxBackoff: TimeSpan.FromSeconds(30), randomFactor: 0.2) ); |
Include Page | ||||
---|---|---|---|---|
|