2025 05 27
2025-05-27¶
Akka Actor¶
- conf
-
설정값
-
bindActor호출 분석 :bindActor[TestActor]("testActor", FromConfig.props(_).withDispatcher("akka.actor.testActor-dispatcher"))bindActor[TestActor]:TestActor타입의 액터를 바인딩(생성/주입가능) 하겠다는 의미"testActor": 생성될 액터(또는 라우터)의 이름을 "testActor" 로 지정. akka 설정 파일에서 해당 액터 설정은/testActor경로를 바라봄FromConfig.props(_): 액터의 props를 설정 파일로부터 가져오겠다는 의미. 설정 파일의deployment섹션의 설정값을 참조하도록 할 수 있음.withDispatcher("akka.actor.testActor-dispatcher"): 액터/라우터가 사용할 디스패처를 명시적으로 지정
-
conf 내 설정값 분석
akka.actor.deployment./testActorrouter = round-robin-pool: 단일 액터가 아닌, 여러testActor의 인스턴스를 관리하는 라우터 액터로 생성. 라운드 로빈 방식으로 메시지를 분배nr-of-instance: 총 4개의 실제testActor를 생성하여 풀로써 관리
akka.actor.testActor-dispatchertype = Dispatcher: 표준 메시지 디스패처executor = "fork-join-executor":ForkJoinPool사용하여, 쓰레드풀 관리parellelism-factor: 스레드 풀 기본 크기를 시스템 CPU의 코어수 x배 설정parellelism-min: 스레드 풀 최소 스레드 수parellelism-max: 스레드 풀 최대 스레드 수
-
-
결정
class Module extends AbstractModule with AkkaGuiceSupport { bindActor[TestActor]("testActor") // 기본 설정 따르도록 }- consumingActor의 nr-of-instances 설정은 액터를 그 갯수 만큼 만들어서 MQ 컨슈머 쪽수 자체를 늘리는 현상이 발생한다.
- 위와 같이 기본 설정이라면, 라우터는 안쓰게 되는거니, 액터는 딱 한개만 만들어짐.
- 이러면 인스턴스당 컨슈머는 한 개로 동작하게 된다.
- 동시 처리할 메시지 갯수를 높이고 싶으면, MQ의 prefetch_count를 높이면 됨.
- 한번에 더 많은 메시지가 액터로 흘러올거고, Future[unit]으로 처리되는 로직이 내부에서 처리됨.
- prefetch_count는 몇으로 하느냐가 일단 지금으로서 산정이 조금 어려움.
- Consumer가 총 4대 있고, 각 prefetch_count가 5라면, 동시에 20개의 메시지가 MQ에 있어야 고루 분배될것.
- 만약 5개의 메시지가 MQ에 있다면 첫번째 consumer에만 메시지가 들어가는 현상이 생길 수도 있음.
- MQ에 메시지 Publishing 되는 추이를 보면서 prefetch_count를 늘리는것이 좋지 않을까 생각이 들었음.
- Thread-pool은 공용을 쓰면 좀 곤란할 수 있으니 별도로 만드는게 좋을까?
- 기본적으로 기본빵 쓰레드 풀을 쓰고있긴함.