콘텐츠로 이동

2024 07 12

2024-07-12

Akka Dispatcher

참고: https://blog.naver.com/kbh3983/221142958800 참고: https://helloino.tistory.com/93 참고: https://velog.io/@leesomyoung/Akka-Classic-Dispatchers

  • 디스패처란?
    • 쓰레드풀에서 실행가능한 스레드를 가져다가 처리할 메시지와 함께 액터에게 전달해 액터가 동작하도록 하는 엔진
    • 디스패처 설정을 통해 쓰레드 풀, 메일박스 관련 설정 가능
    • 디스패처 종류도 쓰레드/메일박스 처리 방식에 따라 나뉨
      1. Dispatcher
      2. Pinned Dispatcher
      3. Balancing Dispatcher
    • 모든 Dispatcher는 ExecutionContext를 상속받음 (Future 실행 가능)
    • 모든 ActorSystem은 디폴트 디스패쳐를 가지고, 특별한 지정 아니면 이걸 사용 (akka.actor.default-dispatcher.executor)
      • executor가 선택되지 않았다면, "fork-join-executor"가 선택됨
  • 설정 방법
    • 클래스 패스 아래 application.conf 설정 파일 읽음
    • fork-join-executor를 사용
    • actor dispatcher 세팅
      my-dispatcher {
          type = Dispatcher
          executor = "fork-join-executor"
          fork-join-executor {
              parallelism-min = 2
              parallelism-factor = 2.0
              parallelism-max = 10
          }
          throughput = 100
      }
      
  • 배포 방식
    1. 액터 선언 방식 유지 : val myActor = context.actorOf(Props[MyActor](), "myActor")
    2. 액터 선언 방식 변경 : val myActor = context.actorOf(Props[MyActor]().withDispatcher("my-dispatcher"), "myActor")
  • Tips
    • 서비스 로직이 Blocking 인 경우, Actor가 하나의 쓰레드 풀을 가지고 있기에 액터가 실행 안될 수 있음