콘텐츠로 이동

2025 05 27

2025-05-27

Akka Actor

  • conf
    akka {
      actor {
        deployment {
          /testActor {
            router = round-robin-pool
            nr-of-instance = 4
          }
        }
    
        testActor-dispatcher {
          type = Dispatcher
          executor = "fork-join-executor"
          fork-join-executor {
            parellelism-factor = 1.0
            parellelism-min = 2
            parellelism-max = 4
          }
        }
      }
    }
    
  • 설정값

    1. 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"): 액터/라우터가 사용할 디스패처를 명시적으로 지정
    2. conf 내 설정값 분석

      • akka.actor.deployment./testActor
        • router = round-robin-pool: 단일 액터가 아닌, 여러 testActor의 인스턴스를 관리하는 라우터 액터로 생성. 라운드 로빈 방식으로 메시지를 분배
        • nr-of-instance: 총 4개의 실제 testActor를 생성하여 풀로써 관리
      • akka.actor.testActor-dispatcher
        • type = Dispatcher: 표준 메시지 디스패처
        • executor = "fork-join-executor": ForkJoinPool 사용하여, 쓰레드풀 관리
        • parellelism-factor: 스레드 풀 기본 크기를 시스템 CPU의 코어수 x배 설정
        • parellelism-min: 스레드 풀 최소 스레드 수
        • parellelism-max: 스레드 풀 최대 스레드 수
  • 결정

    class Module extends AbstractModule with AkkaGuiceSupport {
        bindActor[TestActor]("testActor") // 기본 설정 따르도록
    }
    

    1. consumingActor의 nr-of-instances 설정은 액터를 그 갯수 만큼 만들어서 MQ 컨슈머 쪽수 자체를 늘리는 현상이 발생한다.
    2. 위와 같이 기본 설정이라면, 라우터는 안쓰게 되는거니, 액터는 딱 한개만 만들어짐.
      • 이러면 인스턴스당 컨슈머는 한 개로 동작하게 된다.
      • 동시 처리할 메시지 갯수를 높이고 싶으면, MQ의 prefetch_count를 높이면 됨.
        • 한번에 더 많은 메시지가 액터로 흘러올거고, Future[unit]으로 처리되는 로직이 내부에서 처리됨.
    3. prefetch_count는 몇으로 하느냐가 일단 지금으로서 산정이 조금 어려움.
      • Consumer가 총 4대 있고, 각 prefetch_count가 5라면, 동시에 20개의 메시지가 MQ에 있어야 고루 분배될것.
      • 만약 5개의 메시지가 MQ에 있다면 첫번째 consumer에만 메시지가 들어가는 현상이 생길 수도 있음.
      • MQ에 메시지 Publishing 되는 추이를 보면서 prefetch_count를 늘리는것이 좋지 않을까 생각이 들었음.
    4. Thread-pool은 공용을 쓰면 좀 곤란할 수 있으니 별도로 만드는게 좋을까?
      • 기본적으로 기본빵 쓰레드 풀을 쓰고있긴함.