Akka
1. 개요
1. 개요
Akka는 액터 모델을 기반으로 한 오픈 소스 툴킷 및 런타임이다. 라이트벤드가 개발하였으며, 아파치 라이선스 2.0 하에 배포된다. 주로 분산 시스템 및 고도의 동시성을 요구하는 애플리케이션을 구축하는 데 사용된다.
이 툴킷은 스칼라와 자바 프로그래밍 언어를 위한 라이브러리로 제공된다. 액터 모델을 구현함으로써 개발자는 스레드와 락에 직접 의존하지 않고도 메시지 기반의 격리된 액터를 통해 복잡한 동시성 문제를 보다 쉽게 관리할 수 있다.
Akka의 핵심 구성 요소로는 액터 모델을 구현한 Akka Actors, 반응형 스트림을 처리하는 Akka Streams, 웹 서버 및 클라이언트를 구축하는 Akka HTTP, 그리고 여러 노드를 하나의 논리적 시스템으로 묶는 Akka Cluster 등이 있다.
이러한 설계는 고가용성 시스템, 실시간 데이터 처리, 마이크로서비스 아키텍처와 같은 현대적 요구사항을 충족하는 반응형 애플리케이션을 개발하는 데 적합한 기반을 제공한다.
2. 핵심 개념
2. 핵심 개념
2.1. 액터 모델
2.1. 액터 모델
액터 모델은 동시성과 분산 컴퓨팅을 다루기 위한 수학적 모델이다. 이 모델은 1973년 칼 휴이트(Carl Hewitt)에 의해 제안되었다. 액터 모델의 핵심 아이디어는 시스템을 독립적인 계산 단위인 액터들의 집합으로 구성하는 것이다. 각 액터는 다른 액터와 오직 비동기 메시지 전달을 통해서만 상호작용하며, 공유 메모리를 사용하지 않는다.
액터는 세 가지 기본 능력을 가진다. 첫째, 다른 액터에게 메시지를 보낼 수 있다. 둘째, 새로운 액터를 생성할 수 있다. 셋째, 수신한 메시지에 따라 자신의 내부 상태와 이후의 메시지 처리 방식, 즉 행동을 변경할 수 있다. 이러한 설계는 상태를 공유하지 않으므로 락이나 데드락 같은 전통적인 동시성 문제를 근본적으로 피할 수 있게 해준다.
액터 모델은 특히 고가용성 시스템과 실시간 처리 시스템에 적합하다. 각 액터가 고립되어 실패해도 다른 액터에 직접적인 영향을 미치지 않으며, 감독 계층 구조를 통해 장애를 격리하고 복구하는 패턴을 구현하기 용이하기 때문이다. 이러한 특성은 전화 교환 시스템과 같은 통신 인프라를 모델링하는 데서 출발한 에를랑/OTP 플랫폼에서 먼저 실용적으로 검증되었다.
Akka는 JVM 환경에서 이 액터 모델을 구현한 대표적인 프레임워크이다. Akka는 액터 모델의 이론적 개념을 스칼라와 자바 언어로 사용할 수 있는 구체적인 API와 런타임으로 제공한다. 이를 통해 개발자는 메시지 기반의 반응형 및 탄력적인 애플리케이션을 구축할 수 있다.
2.2. 액터 시스템
2.2. 액터 시스템
액터 시스템은 Akka 애플리케이션의 기본 런타임 컨테이너이자 계층적 구조의 핵심이다. 이 시스템은 모든 액터가 생성되고 존재하는 공간을 제공하며, 액터 간의 통신, 자원 관리, 구성 설정을 담당한다. 하나의 JVM 프로세스 내에는 일반적으로 하나의 액터 시스템이 존재하며, 이는 애플리케이션의 진입점 역할을 한다. 액터 시스템은 효율적인 스레드 풀과 스케줄링 메커니즘을 내장하여 수백만 개의 액터가 소수의 스레드를 공유하며 동시에 실행될 수 있도록 한다.
액터 시스템 내부는 계층 구조를 이루며, 최상위에는 항상 사용자가 생성한 시스템 액터들과 함께 /user, /system, /temp와 같은 내부 가디언 액터가 존재한다. 사용자가 생성하는 모든 액터는 /user 아래에 경로를 가지게 된다. 이 계층 구조는 액터의 감독 관계를 반영하며, 자식 액터의 장애 처리를 체계적으로 관리할 수 있는 기반이 된다. 각 액터는 시스템 내에서 고유한 경로를 가지며, 이를 액터 참조를 통해 안전하게 식별하고 메시지를 전송할 수 있다.
액터 시스템은 설정 파일을 통해 세부적으로 조정할 수 있다. 로깅 어댑터, 직렬화 방식, 디스패처 설정, 네트워크 포트 등 다양한 런타임 특성을 구성할 수 있어, 애플리케이션을 로컬 환경에서 클러스터 환경으로 확장하는 데 필수적이다. 또한, 액터 시스템은 생명주기를 관리하며, 시스템을 종료하면 그 안의 모든 액터도 정리된다.
2.4. 메시지 전달
2.4. 메시지 전달
Akka에서 액터 간의 모든 상호작용은 비동기적 메시지 전달을 통해 이루어진다. 액터는 직접적인 메서드 호출이나 공유 메모리를 사용하지 않고, 오직 메시지를 주고받으며 통신한다. 이 방식은 액터 간의 결합도를 낮추고, 위치 투명성을 제공하며, 시스템의 복원력을 높이는 핵심 원리이다.
메시지는 일반적으로 불변 객체로 정의된다. 액터 시스템 내에서 메시지는 액터의 메일박스라는 큐에 비동기적으로 전달되어 순서대로 처리된다. 각 액터는 receive 메서드를 구현하여 수신한 메시지의 타입에 따라 적절한 행동을 정의한다. 메시지 전송은 기본적으로 fire-and-forget 방식으로, 발신자는 수신 액터가 메시지를 처리할 때까지 기다리지 않는다.
고급 메시징 패턴으로는 특정 응답을 기다리는 요청-응답 패턴이 있다. 이를 위해 발신자는 자신의 액터 참조를 메시지에 포함시킬 수 있으며, 수신 액터는 이 참조를 사용해 발신자에게 답장 메시지를 보낸다. 또한 메시지 어댑터나 요청-응답 프로토콜을 사용하여 응답을 변환하거나 타임아웃을 설정하는 것도 가능하다.
이러한 메시지 기반 통신 모델은 액터 모델의 근간을 이루며, 동시성과 분산 시스템을 안전하고 효율적으로 처리할 수 있는 기반을 제공한다. 메시지 전달의 비동기적이고 격리된 특성은 잠금과 경쟁 조건을 피하게 하여 복잡한 병행 프로그래밍을 단순화한다.
2.5. 상태와 행동
2.5. 상태와 행동
액터는 상태와 행동을 캡슐화하는 기본 단위이다. 각 액터는 변경 가능한 내부 상태를 가질 수 있으며, 이 상태는 오직 해당 액터 자신만이 직접 접근하여 수정할 수 있다. 외부에서는 액터의 상태를 직접 읽거나 변경할 수 없고, 오직 메시지 전달을 통해서만 간접적으로 영향을 줄 수 있다. 이는 객체 지향 프로그래밍에서의 객체와 유사하지만, 상태에 대한 접근이 메시지에 의해 엄격하게 제어된다는 점에서 차이가 있다.
액터의 행동은 수신된 메시지를 어떻게 처리할지를 정의한다. 액터는 메시지를 받으면 현재의 행동에 따라 메시지를 처리하는 로직을 실행한다. 흥미로운 점은 액터의 행동이 런타임 중에 동적으로 변경될 수 있다는 것이다. 예를 들어, 특정 메시지를 받은 후 액터는 context.become() 메서드를 사용하여 새로운 메시지 처리 로직(행동)으로 전환할 수 있다. 이를 통해 유한 상태 기계를 쉽게 모델링하거나, 액터의 동작을 조건에 따라 유연하게 변경하는 것이 가능해진다.
상태와 행동의 이러한 설계는 높은 수준의 모듈성과 캡슐화를 제공한다. 액터 내부의 복잡한 상태 관리 로직이 외부로 노출되지 않기 때문에, 시스템의 각 부분을 독립적으로 이해하고 개발할 수 있다. 또한, 상태가 액터 내부에 격리되어 있기 때문에 동시성 제어가 훨씬 단순해지며, 락이나 동기화 메커니즘 없이도 안전한 상태 변경이 보장된다. 이는 액터 모델이 분산 시스템과 고동시성 애플리케이션 구축에 적합한 이유 중 하나이다.
2.6. 감독
2.6. 감독
액터 시스템에서 감독은 오류 처리와 복원력을 위한 핵심 메커니즘이다. 이는 액터가 자식 액터의 생명주기를 관리하고, 자식 액터에서 발생한 예외나 실패에 대한 처리 전략을 정의하는 책임을 말한다. 감독 전략은 시스템의 견고성을 보장하며, 개별 구성 요소의 실패가 전체 시스템으로 전파되는 것을 방지한다.
감독 구조는 계층적이다. 모든 액터는 자신의 부모 액터에 의해 생성되며, 그 부모는 자식 액터의 감독자가 된다. 최상위 액터는 사용자가 정의한 가디언 액터이며, 이는 액터 시스템의 루트 역할을 한다. 감독자는 자식 액터가 예외를 던질 때마다 사전에 정의된 네 가지 전략 중 하나를 선택하여 대응한다. 이 전략에는 자식을 재시작하거나, 정지시키거나, 재개시키거나, 실패를 에스컬레이션하여 자신의 감독자에게 위임하는 것이 포함된다.
이러한 계층적 오류 처리 방식을 통해 시스템은 격리된 방식으로 장애를 복구할 수 있다. 예를 들어, 특정 작업을 담당하는 자식 액터가 일시적인 오류로 실패하면, 감독자는 해당 자식만 재시작하여 문제를 해결할 수 있다. 이는 전체 애플리케이션을 재시작할 필요 없이, 문제의 범위를 최소화하는 데 기여한다. 이 원칙은 Erlang/OTP의 "Let it crash" 철학에서 영감을 받았다.
감독 전략은 프로그래머가 액터의 동작을 정의할 때 함께 설정할 수 있으며, 이를 통해 애플리케이션의 내결함성 요구사항에 맞춰 세밀한 오류 복구 정책을 구현할 수 있다. 이는 분산 시스템에서 높은 가용성을 달성하는 데 필수적인 요소로 작용한다.
3. 주요 기능
3. 주요 기능
3.1. 액터 생성과 생명주기
3.1. 액터 생성과 생명주기
액터는 액터 시스템 내에서 ActorSystem.actorOf 메서드를 사용하여 생성된다. 이 메서드는 프롭(Props) 객체를 인자로 받는데, 이 객체는 생성될 액터의 구성을 캡슐화한다. 프롭은 액터 클래스와 필요한 생성자 인자를 지정하며, 이를 통해 액터의 인스턴스를 안전하게 생성할 수 있다. 액터는 계층 구조를 이루며, 각 액터는 자신의 자식 액터를 생성하고 감독하는 부모 액터를 가진다.
액터는 생성(started), 실행(running), 중지(stopped)의 세 가지 주요 생명주기 상태를 가진다. 액터가 생성되면 preStart 훅이 호출되어 초기화 작업을 수행할 수 있다. 이후 액터는 메시지를 수신하고 처리하는 실행 상태로 들어간다. 액터가 더 이상 필요하지 않거나 오류로 인해 종료될 때는 postStop 훅이 호출되어 자원 정리와 같은 종료 작업을 수행한다.
액터의 생명주기는 감독 전략과 밀접하게 연결되어 있다. 자식 액터에서 예외가 발생하면, 부모 액터는 정의된 감독 전략에 따라 해당 자식 액터를 재시작(restart)하거나, 종료(stop)하거나, 에러를 무시(resume)하거나, 에스컬레이션(escalate)할 수 있다. 재시작 과정에서는 기존 액터 인스턴스가 제거되고 새로운 인스턴스가 생성되며, 이때 preRestart와 postRestart 훅이 호출된다.
액터를 명시적으로 종료시키기 위해서는 ActorContext.stop 메서드를 사용하거나, 액터에게 포이즌 필(PoisonPill)이라는 특수 메시지를 보낼 수 있다. 액터 시스템 자체를 종료하면 시스템 내의 모든 액터도 순차적으로 종료된다. 이러한 생명주기 관리와 감독 메커니즘은 장애 허용(Fault Tolerance) 시스템을 구축하는 데 핵심적인 역할을 한다.
3.2. 메시지 처리
3.2. 메시지 처리
Akka에서 액터는 메시지를 통해 상호작용한다. 메시지 처리는 액터 모델의 핵심으로, 액터는 자신의 메일박스에 도착한 메시지를 순차적으로 하나씩 처리한다. 이때 메시지는 불변 객체로 정의되어야 하며, 액터 간에 비동기적으로 전달된다. 메시지를 보낸 액터는 응답을 기다리지 않고 다음 작업을 계속할 수 있어 비동기 프로그래밍을 자연스럽게 지원한다.
액터 내부에서는 receive 메서드를 오버라이드하여 처리할 메시지의 패턴을 정의한다. 이 메서드는 패턴 매칭을 사용하여 들어오는 메시지의 타입을 식별하고, 그에 맞는 로직을 실행한다. 메시지 처리 로직은 액터의 현재 상태를 변경하거나, 다른 액터에게 새로운 메시지를 보내거나, 자식 액터를 생성하는 등의 작업을 포함할 수 있다.
메시지 처리 과정에서 예외가 발생하면, 액터의 감독 전략에 따라 처리가 결정된다. 기본적으로 액터는 예외를 복구할 수 없는 경우 중단되며, 그 부모 액터가 이를 감지하여 적절한 조치를 취한다. 이는 시스템의 내결함성을 보장하는 중요한 메커니즘이다.
메시지 전달은 위치 투명성을 제공한다. 즉, 액터는 메시지를 받는 대상이 로컬 JVM에 있든, 원격 노드에 있든 동일한 방식으로 메시지를 보낼 수 있다. 이 추상화는 분산 시스템 구축을 크게 단순화하며, Akka Cluster와 같은 구성 요소가 이를 뒷받침한다.
3.3. 스케줄링
3.3. 스케줄링
Akka의 스케줄링은 액터 시스템 내에서 메시지 전송이나 특정 작업을 미래의 특정 시점에 실행되도록 예약하는 메커니즘이다. 이 기능은 액터에게 지연된 메시지를 보내거나 주기적인 작업을 설정하는 데 핵심적으로 사용된다. 시스템의 스케줄러는 내부적으로 스레드 풀을 관리하며, 모든 액터 시스템은 하나의 공유 스케줄러 인스턴스를 가진다.
주요 스케줄링 작업은 ActorSystem.scheduler.schedule 메서드를 통해 이루어진다. 이 메서드를 사용하면 한 번 실행되는 지연 메시지나, 고정된 간격으로 반복 실행되는 주기적 메시지를 특정 액터 참조나 람다식에 보낼 수 있다. 스케줄링의 시간 단위는 일반적으로 밀리초, 초, 분 등으로 지정된다.
스케줄러는 내부적으로 타이머 기반으로 동작하며, 가비지 컬렉션이나 긴 작업에 의한 지연에 민감하지 않도록 설계되었다. 그러나 매우 정밀한 나노초 단위의 타이밍을 보장하는 실시간 시스템용으로는 적합하지 않다. 스케줄링된 작업은 액터 시스템이 종료되면 자동으로 취소되며, 개발자는 Cancellable 객체를 통해 명시적으로 스케줄링을 취소할 수도 있다.
이러한 스케줄링 기능은 하트비트 메시지 전송, 상태 주기적 갱신, 일정 시간 후 타임아웃 처리 등 다양한 분산 시스템 패턴을 구현하는 데 필수적이다. Akka의 스케줄러는 동시성을 안전하게 제어하는 액터 모델의 일관성 있는 확장으로 작동한다.
3.4. 분산 액터
3.4. 분산 액터
Akka의 분산 액터 기능은 액터 모델을 단일 JVM을 넘어 물리적으로 분리된 여러 머신으로 확장한다. 이를 통해 개발자는 로컬 네트워크 내의 다른 노드나 심지어 인터넷을 통해 연결된 원격 노드에 존재하는 액터와도 투명하게 상호작용하는 애플리케이션을 구축할 수 있다. 이 추상화는 네트워크 통신의 복잡성을 숨기고, 원격 액터에게 메시지를 보내는 방식이 로컬 액터에게 보내는 방식과 본질적으로 동일하게 유지되도록 한다.
분산 액터의 핵심은 액터 시스템 간의 통신을 관리하는 네트워크 프로토콜과 직렬화 메커니즘이다. Akka는 TCP 기반의 사용자 정의 프로토콜을 사용하여 메시지와 액터 참조를 전송한다. 메시지를 네트워크를 통해 보내려면 먼저 바이트 배열로 변환해야 하므로, Akka는 자바 직렬화 외에도 JSON이나 프로토콜 버퍼와 같은 효율적인 직렬화 라이브러리와의 통합을 제공한다.
이 아키텍처는 클라우드 컴퓨팅 환경에서 수평 확장이 용이한 시스템을 구성하는 기반이 된다. 예를 들어, 사용자 세션을 관리하는 액터나 특정 데이터 집합을 처리하는 액터를 클러스터의 여러 노드에 분산시켜 로드 밸런싱과 장애 허용을 달성할 수 있다. Akka 클러스터 컴포넌트는 이러한 분산 액터들을 조율하고 노드의 가입 및 탈퇴를 관리하는 더 고급 기능을 제공한다.
분산 액터 모델의 주요 이점은 위치 투명성이다. 개발자는 액터가 로컬에 있는지 원격에 있는지 사전에 알 필요 없이 액터 참조를 통해 메시지를 보낼 수 있다. 이는 시스템의 탄력적인 재구성을 가능하게 하며, 마이크로서비스 아키텍처나 대규모 실시간 데이터 처리 파이프라인과 같은 분산 시스템 구축에 Akka를 적합하게 만든다.
3.5. 클러스터링
3.5. 클러스터링
Akka 클러스터링은 여러 노드로 구성된 분산 시스템에서 단일한 액터 시스템을 형성하는 기능이다. 이는 애플리케이션을 여러 서버에 걸쳐 확장하고, 단일 장애점을 제거하여 고가용성을 달성하는 데 핵심적이다. 클러스터는 멤버십 서비스를 통해 자동으로 노드들을 감지하고, 노드의 가입 또는 이탈을 관리한다. 이를 통해 개발자는 복잡한 네트워크 통신이나 장애 조치 로직을 직접 구현하지 않고도 탄력적인 클러스터를 구성할 수 있다.
클러스터의 핵심 구성 요소로는 클러스터 씨드 노드, 리더, 가십 프로토콜이 있다. 씨드 노드는 새로운 노드가 클러스터에 처음 접속할 때 연결하는 부트스트랩 지점 역할을 한다. 클러스터 내부에서는 리더 노드가 결정을 내리고, 가십 프로토콜을 통해 모든 노드 간에 효율적으로 클러스터 상태 정보가 전파된다. Akka는 클러스터 샤딩 기능을 제공하여 특정 식별자를 가진 액터를 클러스터 내 특정 노드에 자동으로 할당하고 관리한다. 이는 상태 저장 액터를 분산 환경에서 안전하게 배치하고 재조정하는 데 필수적이다.
또한 Akka 클러스터는 클러스터 싱글톤과 클러스터 클라이언트 같은 유용한 패턴을 지원한다. 클러스터 싱글톤은 전체 클러스터에서 정확히 하나의 인스턴스만 실행되어야 하는 액터를 구현할 때 사용된다. 클러스터 클라이언트는 클러스터 외부의 클라이언트 애플리케이션이 클러스터 내부의 액터들과 통신할 수 있게 하는 게이트웨이 역할을 한다. 이러한 기능들은 마이크로서비스 아키텍처나 대규모 실시간 처리 시스템을 구축할 때 강력한 기반을 제공한다.
3.6. 스트리밍
3.6. 스트리밍
Akka Streams는 Akka 툴킷의 구성 요소로, 스트리밍 데이터 처리를 위한 선언적이고 비동기적인 API를 제공한다. 이는 액터 모델의 강력한 동시성 모델 위에 구축되었으며, 백프레셔를 자동으로 처리하여 안정적인 데이터 처리를 보장한다. 개발자는 데이터 흐름을 소스, 플로우, 싱크와 같은 재사용 가능한 구성 요소로 정의하여 복잡한 스트리밍 파이프라인을 쉽게 구성할 수 있다.
Akka Streams의 핵심은 리액티브 스트림 사양을 구현하여 구성 요소 간에 비동기적이고 논블로킹 방식으로 데이터를 처리하면서도, 빠른 생산자가 느린 소비자를 압도하지 않도록 자동으로 흐름을 제어한다는 점이다. 이를 통해 메모리 관리와 시스템 안정성을 유지한다. 이 라이브러리는 파일 입출력, 네트워크 통신, 메시지 큐 연동 등 다양한 I/O 작업과 원활하게 통합된다.
주요 사용 사례로는 실시간 분석, ETL 프로세스, 미디어 스트리밍 처리, 이벤트 소싱 기반 애플리케이션의 이벤트 스트림 처리 등이 있다. 또한 Akka HTTP는 내부적으로 Akka Streams를 사용하여 HTTP 요청과 응답을 스트림으로 처리하며, Akka Persistence와 같은 다른 모듈과도 결합되어 사용될 수 있다.
4. 구성 요소
4. 구성 요소
4.1. Akka Actors
4.1. Akka Actors
Akka Actors는 Akka 툴킷의 핵심 모듈로, 액터 모델을 구현하여 동시성과 분산 시스템을 위한 추상화를 제공한다. 이 모듈은 개발자가 메시지 전달 방식을 통해 상태를 캡슐화하고 격리된 액터 단위로 병렬 처리를 설계할 수 있게 한다. 각 액터는 고유한 메일박스를 가지고 비동기적으로 메시지를 처리하며, 감독 계층 구조를 통해 장애를 격리하고 복구하는 내결함성을 갖춘다.
Akka Actors는 스칼라와 자바 API를 모두 제공하여 두 언어 생태계의 개발자들이 활용할 수 있다. 런타임은 액터 시스템을 관리하며, 액터의 생성, 생명주기 관리, 메시지 스케줄링, 원격 통신 기반 시설을 담당한다. 이를 통해 개발자는 복잡한 스레드 관리나 락 동기화 문제에서 벗어나 비즈니스 로직에 집중할 수 있다.
이 모듈은 단일 JVM 내에서의 고성능 동시성 처리는 물론, 네트워크를 통한 분산 액터 간 통신도 기본적으로 지원한다. 액터는 액터 참조와 액터 경로를 통해 식별되며, 로컬이든 원격이든 투명하게 메시지를 주고받을 수 있다. 이러한 설계는 확장성이 뛰어난 반응형 애플리케이션을 구축하는 데 필수적인 기반이 된다.
4.2. Akka Streams
4.2. Akka Streams
Akka Streams는 Akka 툴킷의 구성 요소 중 하나로, 스트리밍 데이터 처리를 위한 반응형 스트림(Reactive Streams) 구현체이다. 액터 모델 위에 구축되어 비동기적이고 백프레셔(backpressure)를 지원하는 데이터 처리 파이프라인을 구성할 수 있게 해준다. 이를 통해 유한하거나 무한한 데이터 흐름을 선언적이고 구성 가능한 방식으로 안전하게 처리할 수 있다.
Akka Streams의 핵심 구성 요소는 소스(Source), 싱크(Sink), 플로우(Flow)이다. 소스는 데이터 흐름의 시작점, 싱크는 종착점, 플로우는 데이터를 변환하는 처리 단계를 나타낸다. 이러한 구성 요소들을 연결하여 비순환 방향 그래프(DAG) 형태의 처리 로직을 정의하고, 이를 실행자(Materializer)를 통해 실행한다. 이 구조는 복잡한 ETL(추출, 변환, 적재) 작업이나 실시간 분석 파이프라인을 구축하는 데 적합하다.
주요 장점은 백프레셔 메커니즘을 통해 생산자와 소비자 간의 처리 속도 차이로 인한 문제를 자동으로 해결한다는 점이다. 소비자가 처리할 수 있는 속도만큼만 데이터를 요청하므로 메모리 오버플로우를 방지하고 시스템을 안정적으로 유지한다. 또한 액터 시스템과의 긴밀한 통합을 통해 분산 스트리밍이나 높은 수준의 내결함성을 요구하는 시나리오에도 적용할 수 있다.
Akka Streams는 Akka HTTP의 기반이 되어 HTTP 요청과 응답을 스트림으로 처리하며, Apache Kafka나 Apache Cassandra와 같은 외부 시스템과의 연동을 위한 커넥터도 제공한다. 따라서 마이크로서비스, IoT 데이터 파이프라인, 미디어 스트리밍 등 다양한 고부하 실시간 시스템 구축에 활용된다.
4.3. Akka HTTP
4.3. Akka HTTP
Akka HTTP는 Akka 툴킷의 구성 요소 중 하나로, 액터 모델과 Akka Streams를 기반으로 구축된 완전한 서버 및 클라이언트 측 HTTP 스택이다. 이는 고수준의 API와 저수준의 서버 사이드 API를 모두 제공하여, 마이크로서비스나 REST API와 같은 HTTP 기반 통신을 필요로 하는 반응형 시스템을 구현하는 데 적합하다. Akka HTTP는 비동기적이고 논블로킹 방식으로 설계되어 높은 동시성과 처리량을 달성할 수 있다.
주요 기능으로는 라우팅 DSL을 통한 선언적 웹 서비스 정의, JSON 및 XML과 같은 형식의 자동 직렬화 및 역직렬화, SSL/TLS 지원, 웹소켓 프로토콜 지원 등이 있다. 또한 Akka Streams와의 긴밀한 통합을 통해 HTTP 요청과 응답을 스트림으로 처리할 수 있어, 대용량 데이터의 실시간 처리가 가능하다.
Akka HTTP는 서버로서의 역할뿐만 아니라, 클라이언트 측 HTTP 요청을 수행하는 기능도 제공한다. 이를 통해 외부 API 호출이나 다른 서비스와의 통신을 효율적으로 관리할 수 있다. 이 구성 요소는 Akka 생태계의 다른 부분, 예를 들어 Akka Cluster나 Akka Persistence와 결합하여 복잡한 분산 시스템을 구축하는 데 활용된다.
4.4. Akka Cluster
4.4. Akka Cluster
Akka Cluster는 Akka 툴킷의 핵심 구성 요소 중 하나로, 여러 노드에 걸쳐 단일 분산 시스템을 형성할 수 있게 해주는 기능이다. 이를 통해 개발자는 클러스터를 하나의 논리적 액터 시스템으로 취급하여 고가용성과 탄력성을 갖춘 애플리케이션을 구축할 수 있다. 클러스터는 장애 허용 시스템을 구현하는 데 필수적인 기반을 제공한다.
클러스터의 핵심은 클러스터 멤버십 서비스이다. 이 서비스는 가십 프로토콜을 사용하여 클러스터에 속한 모든 노드의 상태를 추적하고, 노드의 가입 또는 이탈을 자동으로 감지하여 클러스터 상태를 일관되게 유지한다. 각 노드는 호스트와 포트로 식별되며, 시드 노드 목록을 통해 초기 클러스터에 조인한다. 클러스터는 리더 노드를 선출하여 싱글톤 액터 배치나 상태 전환과 같은 결정을 내리도록 한다.
Akka Cluster는 클러스터 샤딩과 클러스터 싱글톤 같은 유용한 패턴을 제공한다. 클러스터 샤딩은 많은 수의 액터를 클러스터의 여러 노드에 자동으로 분산하여 관리하는 메커니즘이다. 반면 클러스터 싱글톤은 전체 클러스터에서 정확히 하나의 인스턴스만 실행되어야 하는 액터를 보장한다. 또한 클러스터 클라이언트를 통해 클러스터 외부에서 내부 액터와 통신할 수 있는 기능도 지원한다.
이러한 기능들은 분산 데이터 처리, 로드 밸런싱, 장애 조치가 필요한 대규모 시스템을 구성하는 데 적합하다. Akka Cluster는 마이크로서비스 아키텍처나 이벤트 소싱 및 CQRS 패턴을 구현하는 반응형 시스템의 백본으로 널리 사용된다.
4.5. Akka Persistence
4.5. Akka Persistence
Akka Persistence는 Akka 툴킷의 구성 요소 중 하나로, 액터 모델 기반의 애플리케이션에 지속성(Persistence) 기능을 제공한다. 이는 액터의 상태를 안정적인 저장소에 저장하고 복구할 수 있게 하여, 시스템 장애나 재시작 후에도 상태를 유지할 수 있도록 설계되었다.
Akka Persistence의 핵심 개념은 이벤트 소싱(Event Sourcing)과 CQRS(Command Query Responsibility Segregation) 패턴을 기반으로 한다. 액터는 자신의 상태를 직접 저장하는 대신, 상태를 변경시키는 모든 이벤트를 순서대로 저장소에 기록한다. 이 이벤트 로그를 재생함으로써 액터는 장애 발생 시점의 상태로 완전히 복구될 수 있다. 이 접근 방식은 상태의 변경 이력을 완전히 보존하며, 감사나 디버깅에 유용하다.
이를 구현하기 위해 Akka Persistence는 몇 가지 주요 인터페이스를 제공한다. PersistentActor는 지속성이 필요한 액터가 상속하는 기본 추상 클래스이며, 명령(Command)을 처리하고 이벤트(Event)를 생성하며, 생성된 이벤트를 저장소에 기록하는 로직을 포함한다. 또한 Snapshot 기능을 통해 특정 시점의 전체 상태를 저장하여, 장기간 실행되는 액터의 복구 시간을 단축시킬 수 있다.
Akka Persistence는 다양한 백엔드 저장소를 플러그인 형태로 지원한다. 기본적으로 로컬 파일 시스템을 사용하는 LevelDB 플러그인이 포함되어 있으며, Apache Cassandra나 관계형 데이터베이스와 같은 외부 데이터베이스를 위한 플러그인도 커뮤니티나 상용으로 제공된다. 이를 통해 개발자는 애플리케이션 요구사항에 맞는 적절한 지속성 계층을 선택할 수 있다.
5. 사용 사례
5. 사용 사례
5.1. 고가용성 시스템
5.1. 고가용성 시스템
Akka는 액터 모델을 구현한 프레임워크로서, 고장에 강하고 자가 치유 능력을 갖춘 고가용성 시스템을 구축하는 데 적합한 도구이다. 시스템의 개별 구성 요소를 독립적인 액터로 모델링하고, 이들 간의 통신을 비동기 메시지 전달에 의존함으로써, 하나의 구성 요소에 장애가 발생하더라도 전체 시스템이 중단되지 않고 계속 작동할 수 있도록 설계한다. 이러한 접근 방식은 전통적인 스레드 기반 동시성 모델에서 흔히 발생하는 데드락이나 경쟁 상태 같은 문제를 피하면서도 복원력을 확보할 수 있게 해준다.
고가용성을 실현하는 핵심 메커니즘은 감독 전략이다. Akka의 액터 시스템에서는 모든 액터가 상위 액터인 슈퍼바이저의 감독을 받는다. 하위 액터가 예외를 던지거나 실패하면, 슈퍼바이저는 미리 정의된 전략에 따라 이를 처리한다. 일반적인 전략으로는 실패한 액터를 재시작하거나, 완전히 중지시키거나, 오류를 더 상위로 전파하는 것이 있다. 이로 인해 장애가 발생한 부분만 격리되어 처리되고, 시스템의 나머지 부분은 정상적으로 작동을 유지할 수 있다.
또한 Akka는 Akka Cluster와 같은 모듈을 통해 분산 환경에서의 고가용성을 지원한다. 여러 노드에 걸쳐 액터 시스템을 클러스터링하여 단일 장애점을 제거할 수 있다. 클러스터 내에서 액터는 특정 노드에 고정되지 않고 분산되어 존재할 수 있으며, 한 노드가 다운되면 다른 노드에서 해당 액터를 재생성하거나 메시지를 재라우팅하는 방식으로 서비스의 연속성을 보장한다. 이는 마이크로서비스 아키텍처나 실시간 데이터 처리 파이프라인과 같이 중단이 허용되지 않는 시스템을 구성할 때 매우 유용하다.
이러한 특성들 덕분에 Akka는 금융 거래 시스템, 통신 플랫폼, IoT 백엔드 서비스 등 고도의 가용성과 신뢰성이 요구되는 엔터프라이즈 소프트웨어 개발에 널리 활용된다. 시스템의 복잡성을 관리하면서도 장애에 대한 탄력성과 확장성을 동시에 제공하는 Akka의 접근법은 현대적인 반응형 시스템의 핵심 원칙을 구현한 것으로 평가받는다.
5.2. 실시간 데이터 처리
5.2. 실시간 데이터 처리
Akka는 액터 모델을 기반으로 설계되어 본질적으로 비동기적이고 이벤트 기반의 메시지 처리 방식을 채택한다. 이는 실시간 데이터 처리에 매우 적합한 특성으로, 데이터 스트림이 지속적으로 유입되는 환경에서도 낮은 지연 시간과 높은 처리량을 유지할 수 있게 한다. 각 액터는 독립적으로 메시지를 처리하며, 블로킹 없이 병렬 처리가 가능하기 때문이다.
이러한 실시간 처리는 주로 Akka Streams 모듈을 통해 구현된다. 이 모듈은 백프레셔 메커니즘을 내장하여 데이터 생산자와 소비자 사이의 속도 불일치 문제를 자동으로 관리한다. 이를 통해 메모리 오버플로우를 방지하면서도 실시간으로 유입되는 데이터 파이프라인을 안정적으로 구성할 수 있다. 센서 데이터, 금융 거래, 사용자 활동 로그와 같은 연속적인 이벤트 스트림을 처리하는 데 널리 활용된다.
또한 Akka Cluster를 활용하면 실시간 데이터 처리를 위한 시스템을 수평 확장할 수 있다. 여러 노드에 걸쳐 액터를 분산시켜 부하 분산을 수행함으로써, 대규모 실시간 데이터의 유입에도 탄력적으로 대응하는 분산 시스템을 구축할 수 있다. 이는 고가용성과 장애 허용을 요구하는 실시간 비즈니스 인텔리전스나 모니터링 시스템의 기반이 된다.
5.3. 분산 시스템
5.3. 분산 시스템
Akka는 본질적으로 분산 시스템을 구축하기 위한 도구이다. 액터 모델은 메시지 전달을 통한 느슨한 결합과 위치 투명성을 제공하는데, 이는 분산 환경에 매우 적합한 특성이다. 개발자는 단일 JVM 내에서 동작하는 액터 시스템을 설계하고, 이후 필요에 따라 물리적으로 분리된 여러 노드에 걸쳐 시스템을 투명하게 확장할 수 있다. 이때 액터 간의 통신은 여전히 동일한 메시지 전달 API를 통해 이루어지며, 상대방 액터가 로컬에 있는지 원격에 있는지를 코드 수준에서 크게 신경 쓸 필요가 없다.
이러한 분산 기능을 구현하는 핵심은 Akka Cluster 구성 요소이다. 클러스터는 여러 액터 시스템 인스턴스를 하나의 논리적 응용 프로그램으로 묶는다. 클러스터 내의 노드는 가십 프로토콜을 사용하여 서로의 상태를 교환하고, 장애 감지 메커니즘을 통해 비정상 노드를 식별하여 시스템 전체의 고가용성을 유지한다. 분산 데이터 구조나 클러스터 샤딩과 같은 고급 패턴을 활용하면, 특정 역할을 가진 액터를 클러스터 전체에 자동으로 분산시키고 장애 발생 시 재배치하는 것이 가능해진다.
따라서 Akka를 사용한 분산 시스템은 마이크로서비스 아키텍처, 실시간 분석 파이프라인, 대규모 MMO 게임 백엔드, IoT 플랫폼과 같이 높은 처리량과 복원력이 요구되는 시나리오에 널리 적용된다. 전통적인 RPC나 REST API 기반의 통신보다 액터 모델의 비동기 메시징이 동시성 제어와 장애 격리를 더욱 효율적으로 처리할 수 있게 해주기 때문이다.
5.4. 반응형 애플리케이션
5.4. 반응형 애플리케이션
Akka는 반응형 선언문의 원칙을 구현하는 데 적합한 도구이다. 반응형 애플리케이션은 응답성, 탄력성, 회복성, 메시지 주도라는 네 가지 핵심 특성을 갖추어야 한다. Akka의 액터 모델은 이러한 특성을 자연스럽게 지원하는 아키텍처를 제공한다. 각 액터는 비동기 메시지 전달을 통해 통신하며, 이는 시스템이 메시지 주도적이고 느슨하게 결합되도록 한다.
액터의 격리된 상태와 독립적인 실패 처리는 시스템의 회복성을 보장한다. 한 액터의 장애가 다른 액터로 직접 전파되지 않으며, 감독 전략을 통해 장애를 격리하고 복구할 수 있다. 또한 액터 시스템은 수평 확장이 용이하여 부하에 따라 탄력적으로 리소스를 조정할 수 있다. 이는 클라우드 컴퓨팅 환경이나 마이크로서비스 아키텍처에서 특히 중요하다.
Akka를 사용한 반응형 애플리케이션은 실시간 처리, 고가용성 시스템, 대규모 분산 시스템 등 다양한 영역에서 활용된다. 예를 들어, 금융 거래 플랫폼, IoT 데이터 파이프라인, 소셜 미디어 피드 처리와 같이 낮은 지연 시간과 높은 처리량이 요구되는 시나리오에 적합하다. Akka 클러스터는 지리적으로 분산된 노드들 간에 액터 시스템을 구성하여 이러한 요구사항을 충족시킨다.
Akka의 모듈화된 생태계는 반응형 애플리케이션 구축을 더욱 용이하게 한다. Akka Streams는 백프레셔를 지원하는 스트리밍 데이터 처리 라이브러리이며, Akka HTTP는 반응형 웹 서버 및 클라이언트를 구축하는 데 사용된다. 이러한 구성 요소들은 함께 작동하여 개발자가 메시지 주도적이고 탄력적이며 응답성이 뛰어난 시스템을 효과적으로 설계하고 구현할 수 있는 기반을 마련해 준다.
6. 장단점
6. 장단점
6.1. 장점
6.1. 장점
Akka의 주요 장점은 액터 모델을 구현함으로써 얻는 강력한 동시성 처리 능력과 탄력적인 시스템 설계에 있다. 액터 모델은 각 액터가 독립적인 상태와 행동을 가지며, 비동기 메시지 전달을 통해 통신하는 패러다임이다. 이는 공유 메모리와 락 기반의 전통적인 동시성 프로그래밍에서 발생하는 복잡성과 데드락 문제를 근본적으로 피할 수 있게 해준다. 개발자는 스레드나 락을 직접 관리하는 대신, 메시지를 주고받는 액터를 설계하는 데 집중할 수 있어, 안전하고 이해하기 쉬운 동시성 코드를 작성할 수 있다.
또한 Akka는 내결함성과 탄력성을 핵심 원칙으로 설계되었다. 액터 시스템은 계층적인 감독 구조를 가지며, 자식 액터에서 발생한 오류는 상위 감독 액터가 처리하도록 구성된다. 이를 통해 특정 구성 요소의 실패가 전체 시스템으로 전파되는 것을 막고, 오류를 격리하여 복구하거나 재시작할 수 있다. 이는 고가용성이 요구되는 분산 시스템을 구축하는 데 매우 유리하다.
Akka는 단일 JVM 내에서의 강력한 동시성 처리를 넘어, Akka Cluster와 같은 구성 요소를 통해 지리적으로 분산된 환경에서도 투명하게 액터를 확장할 수 있다. 로드 밸런싱과 클러스터링 기능을 통해 시스템의 규모를 수평적으로 확장하는 것이 용이하며, 실시간 데이터 처리나 대규모 반응형 애플리케이션을 구현하는 데 적합한 기반을 제공한다. 이러한 확장성은 빅데이터 파이프라인이나 IoT 플랫폼과 같은 현대적 요구사항에 부응한다.
마지막으로, Akka는 스칼라와 자바를 모두 지원하는 포괄적인 생태계를 갖추고 있다. 핵심인 Akka Actors 외에도 Akka Streams를 통한 백프레셔가 적용된 스트리밍 데이터 처리, Akka HTTP를 이용한 고성능 웹 API 서버 구축, Akka Persistence를 활용한 액터 상태의 지속화 등 다양한 모듈을 제공한다. 이는 개발자가 일관된 철학과 API 아래에서 복잡한 분산 시스템의 다양한 측면을 통합적으로 해결할 수 있게 한다.
6.2. 단점
6.2. 단점
Akka는 강력한 도구이지만, 몇 가지 학습 및 운영상의 어려움을 가지고 있다. 첫째, 액터 모델이라는 새로운 프로그래밍 패러다임을 익혀야 한다. 개발자는 상태를 공유하지 않는 메시지 기반 통신과 분산된 상태 관리에 대한 사고방식의 전환이 필요하며, 이는 기존의 객체 지향 프로그래밍이나 명령형 프로그래밍에 익숙한 개발자에게는 높은 학습 곡선을 형성한다.
둘째, 복잡한 디버깅과 모니터링이 어려울 수 있다. 수많은 액터가 비동기적으로 메시지를 교환하는 분산 환경에서는 특정 메시지의 흐름을 추적하거나, 데드레터 메일박스와 같은 문제를 진단하는 과정이 복잡해진다. 또한, 액터 시스템 내부의 상태를 실시간으로 관찰하기 위한 도구와 기술이 추가로 요구된다.
셋째, 자바 가상 머신 환경에 종속적인 특성상, 순수한 액터 모델 구현체인 Erlang/OTP에 비해 격리와 장애 허용 능력에 있어 이론적 한계가 있다. Erlang의 프로세스는 완전히 격리되어 있지만, Akka 액터는 동일한 자바 가상 머신 내의 스레드를 공유할 수 있어, 한 액터의 오류가 전체 시스템에 영향을 미칠 가능성이 상대적으로 더 크다.
마지막으로, Akka의 기능이 방대하고 모듈이 다양하여, 프로젝트 초기 설정과 필요한 구성 요소를 선택하고 조합하는 것이 부담스러울 수 있다. Akka Cluster나 Akka Persistence 같은 고급 모듈을 사용할 경우, 그에 따른 추가적인 구성과 운영 복잡도가 증가한다는 점도 단점으로 지적된다.
7. 관련 기술
7. 관련 기술
7.1. Erlang/OTP
7.1. Erlang/OTP
Akka는 액터 모델을 구현한 오픈 소스 툴킷이자 런타임으로, 분산 시스템과 고도로 동시적인 애플리케이션을 구축하는 데 사용된다. Akka의 설계와 철학은 Erlang 프로그래밍 언어와 그 플랫폼인 OTP에서 강한 영향을 받았다.
Erlang/OTP는 통신 장비를 위한 내결함성 시스템을 구축하기 위해 에릭슨에서 개발된 언어 및 프레임워크로, 액터 모델을 실용적으로 구현한 선구자이다. Akka는 이 Erlang/OTP의 핵심 개념인 액터, 감독 전략, 격리, let-it-crash 철학을 JVM 환경, 특히 스칼라와 자바 언어로 가져왔다. 이는 개발자가 Erlang의 강력한 동시성 및 내결함성 모델을 익숙한 자바 생태계에서 활용할 수 있게 해준다.
두 기술의 주요 차이점은 실행 환경과 언어에 있다. Erlang/OTP는 자체적인 가상 머신 위에서 동작하는 함수형 언어인 반면, Akka는 JVM 위에서 주로 객체지향 언어를 통해 사용된다. 또한 Akka는 Erlang의 원격 메시징과 클러스터링 기능을 넘어 Akka HTTP나 Akka Streams와 같은 추가적인 반응형 스트리밍 라이브러리를 통합하여 더 넓은 범위의 애플리케이션 아키텍처를 지원한다.
따라서 Akka는 Erlang/OTP로 대표되는 액터 모델의 장점을 계승하면서도, 현대적인 JVM 기반 마이크로서비스 및 클라우드 네이티브 애플리케이션 개발에 적합하도록 진화한 프레임워크로 볼 수 있다.
7.2. Akka.NET
7.2. Akka.NET
Akka.NET은 액터 모델을 구현한 .NET 프레임워크용 오픈 소스 툴킷이다. 원래 스칼라와 자바로 작성된 Akka의 개념과 API를 C# 및 F#과 같은 .NET 언어로 포팅한 것이다. 이는 마이크로소프트의 .NET 생태계에서도 분산 시스템과 동시성이 높은 반응형 애플리케이션을 구축할 수 있도록 설계되었다.
Akka.NET의 핵심 구성 요소는 Akka.NET Actors이며, 이를 통해 개발자는 격리된 상태와 비동기 메시지 전달을 특징으로 하는 액터를 생성하고 관리할 수 있다. 또한 Akka.NET Cluster, Akka.NET Persistence, Akka.NET Streams와 같은 모듈을 제공하여 클러스터링, 상태 지속성, 스트리밍 데이터 처리와 같은 고급 기능을 지원한다. 이러한 모듈들은 Erlang/OTP에서 영감을 받은 감독 전략과 결합되어 고가용성 시스템을 구성하는 데 필수적이다.
Akka.NET은 윈도우, 리눅스, macOS 등 다양한 플랫폼에서 실행되며, .NET Core와 .NET 5 이상의 크로스 플랫폼 환경을 완벽히 지원한다. 이는 기존 JVM 기반의 Akka와 유사한 아키텍처 이점을 .NET 개발자들에게 제공함으로써, 마이크로서비스, 실시간 데이터 처리, 게임 서버 백엔드 등 다양한 분야의 애플리케이션 개발에 활용된다.
7.3. Vert.x
7.3. Vert.x
Vert.x는 JVM 상에서 실행되는 이벤트 기반의 애플리케이션 툴킷이다. Node.js와 유사한 논블로킹 비동기 프로그래밍 모델을 채택하여 높은 동시성과 확장성을 제공하는 것이 특징이다. Akka가 액터 모델에 기반한 메시지 패싱을 중심으로 설계되었다면, Vert.x는 경량의 이벤트 버스와 비동기 API를 중심으로 구성된다. 이 툴킷은 자바, 코틀린, 스칼라, 그루비 등 여러 JVM 언어를 지원한다.
Vert.x의 핵심은 이벤트 루프와 비동기 I/O 모델이다. 애플리케이션은 여러 이벤트 루프 스레드 위에서 실행되며, 모든 I/O 작업은 논블로킹 방식으로 처리되어 스레드가 블록되는 것을 방지한다. 이를 통해 단일 서버에서도 수만 개의 동시 연결을 효율적으로 처리할 수 있다. 주요 구성 요소로는 이벤트 버스, Verticle, 그리고 다양한 기술 통합을 위한 모듈(예: 웹, 인증, 데이터베이스 클라이언트)이 있다.
Vert.x는 마이크로서비스, 실시간 웹 애플리케이션, API 게이트웨이, 그리고 고성능 프록시 서버 구축에 널리 사용된다. 반응형 시스템 원칙을 따르며, 메시지 큐나 외부 브로커 없이도 내부 이벤트 버스를 통해 컴포넌트 간의 느슨한 결합을 가능하게 한다. 또한 클러스터링을 지원하여 여러 노드에 걸쳐 이벤트 버스와 서비스를 확장할 수 있다.
Akka와 비교했을 때, Vert.x는 더 폭넓은 프로토콜과 기술 스택에 대한 즉시 사용 가능한 비동기 클라이언트를 제공하는 경향이 있다. 반면 Akka는 액터 모델에 따른 강력한 상태 관리와 장애 허용 메커니즘에 더 중점을 둔다. 두 프레임워크 모두 분산 시스템과 고부하 애플리케이션을 구축하는 데 적합하지만, 선택은 개발 팀의 선호도와 구체적인 아키텍처 요구사항에 따라 달라진다.
7.4. Spring Reactor
7.4. Spring Reactor
Spring Reactor는 Spring Framework 생태계의 일부로, 반응형 프로그래밍 패러다임을 구현한 라이브러리이다. 논블로킹 I/O와 백프레셔를 지원하는 리액티브 스트림 사양을 기반으로 하여, 적은 수의 스레드로 높은 동시성과 확장성을 가진 애플리케이션을 구축할 수 있게 한다. Akka가 액터 모델을 중심으로 설계된 반면, Spring Reactor는 함수형 프로그래밍 스타일과 이벤트 드리븐 아키텍처에 중점을 둔다.
주요 구성 요소로는 0개 또는 1개의 데이터를 비동기적으로 처리하는 Mono와 0개에서 N개의 데이터 스트림을 처리하는 Flux가 있다. 이들은 Publisher 인터페이스를 구현하며, 데이터의 생성, 변환, 필터링, 구독을 위한 풍부한 연산자 API를 제공한다. 이를 통해 개발자는 선언적인 방식으로 복잡한 비동기 데이터 흐름을 구성하고 관리할 수 있다.
Spring Reactor는 Spring WebFlux를 통해 웹 애플리케이션과 REST API 개발에 널리 사용된다. 또한 Spring Data, Spring Security, Spring Cloud 등 다른 Spring 프로젝트들과 통합되어 종합적인 반응형 마이크로서비스 아키텍처를 구성하는 데 활용된다. Akka와의 주요 차이점은 액터라는 격리된 상태 컨테이너 대신, 데이터 스트림과 변환 파이프라인을 중심으로 한 프로그래밍 모델에 있다.
이 라이브러리는 자바와 코틀린을 공식적으로 지원하며, 스프링 부트를 통해 쉽게 프로젝트에 도입할 수 있다. 마이크로서비스, 실시간 데이터 처리, 스트리밍 서비스와 같이 높은 처리량과 낮은 지연시간이 요구되는 현대적 애플리케이션 개발에 적합하다.
8. 여담
8. 여담
Akka라는 이름은 스웨덴의 산악 지역인 아카에서 유래한다. 이 이름은 라이트벤드의 공동 창립자이자 스칼라의 창시자인 마틴 오더스키가 제안했다. 그는 스웨덴의 산악 지형이 시스템의 견고함과 복원력을 상징한다고 생각했다. 이는 Akka가 목표로 하는 고가용성과 탄력적인 분산 시스템의 철학과 일맥상통한다.
Akka는 원래 스칼라 언어로 작성되었으며, 스칼라의 함수형 프로그래밍 패러다임과 액터 모델이 자연스럽게 결합된다. 이후 자바 개발자들의 광범위한 수요를 반영하여 자바 API도 공식적으로 제공되기 시작했다. 이를 통해 자바 생태계에서도 액터 모델의 이점을 활용할 수 있게 되었다.
Akka의 성공과 영향력은 다른 언어와 플랫폼으로의 포팅을 촉진했다. 대표적인 예가 닷넷 프레임워크용 Akka.NET이다. 또한, Akka의 설계 철학과 반응형 스트림 구현은 스프링 프레임워크의 프로젝트 리액터와 같은 현대적인 리액티브 라이브러리들에 영감을 주었다.
