Akka는 Open Source Tool Kit으로 JVM 상에서 동시성과 분산 애플리케이션을 단순화하는 런타임이다. Erlang(범용 병렬 프로그래밍 언어 / 함수형 언어)으로부터 영향을 받아 Actor 기반의 동시성
이 두드러진다.
Actor Model
액터 모델은 얼랭(Erlang)으로 구체화된 개념이며, 스웨덴 통신회사인 에릭슨에서 고도의 동시성 프로그램을 구현할 때 사용했다.
Actor는thread
또는객체
와 구별되는 추상이다. Actor가 차지하는 메모리 공간은 어느 다른 쓰레드 혹은 액터가 접근할 수 없다. 즉, 액터 내부에서 일어나는 일은 다른 누구와도 "공유"되지 않는다.
액터 내부의 자원이 공유되지 않으므로lock
이나synchronized
같은 키워드는 필요가 없다.
Actor Model은 이러한 Actor를 기본 단위로 설정한다. 이러한 actor들은 메시지만 주고받으므로 race condition이나 deadlock과 같은 문제를 고민하지 않아도 된다.
Akka는 비동기화 Message 방식의 Actor Model을 구현하여 Erlang의 라이브러리가 지원하는 고도의 동시성 쓰기, 이벤트 주도 애플리케이션을 Java와 Scala에 유사한 기능을 도입하고자 한 라이브러리다.
위쪽에서 Actor Model에 대해 알아보며 왜 Actor Model이 thread 대신 사용되는지를 알게 되었다. 이를 더 자세히 풀어 써볼 예정이다.
CPU 사양이 발전하며 멀티 코어 제품군이 많아졌고, 이에 따라 멀티 스레드 프로그래밍이 발전하였다. 하지만 멀티 스레드 프로그래밍 방식에는 동시성 문제, 가시성 문제와 같은 여러 문제가 발생하였고, Actor Model을 통해 해결하고자 한 것이 Akka다.
위 이미지는 Actor의 구조이다. Actor 내부에는 다른 객체나 스레드가 접근할 수 없으므로
Actor간 통신은 Message 전달이며, Event가 발생하면 비동기적으로 하나의 Actor에서 단일 큐를 사용한다. 여러 액터가 각각의 Message Queue를 이용하여 thread보다 actor의 메모리가 적다.