액터
1. 개요
1. 개요
액터는 액터 모델에서의 기본적인 계산 단위이다. 이는 메시지를 주고받으며 독립적으로 동작하는 객체 또는 프로세스로 정의된다. 이 개념은 1973년 칼 휴이트가 관련 논문을 통해 최초로 제안하였다.
액터의 핵심 특징은 상태 캡슐화, 동시성 보장, 메시지 기반 통신, 그리고 위치 투명성을 포함한다. 각 액터는 자신의 상태를 외부에 직접 노출하지 않고, 비동기적인 메시지 전달을 통해 다른 액터와만 소통한다. 이는 전통적인 공유 메모리 방식을 사용하는 동시성 모델과 구별되는 점이다.
이러한 설계 덕분에 액터 모델은 분산 시스템, 고동시성 애플리케이션, 그리고 내결함성 시스템 구축에 주요하게 활용된다. 액터들은 서로 느슨하게 결합되어 있으며, 물리적으로 다른 서버에 분산되어 있어도 동일한 방식으로 상호작용할 수 있다.
액터 모델은 병행 컴퓨팅과 분산 컴퓨팅 분야의 중요한 패러다임이며, 함수형 프로그래밍의 원리와도 깊은 연관성을 가진다. 이는 복잡한 동시성 문제를 관리 가능한 단위로 분해하고, 시스템의 확장성과 견고함을 높이는 데 기여한다.
2. 역사
2. 역사
액터 모델의 역사는 1973년으로 거슬러 올라간다. 컴퓨터 과학자 칼 휴이트는 당시의 전통적인 계산 모델이 병행 컴퓨팅과 분산 컴퓨팅의 본질을 제대로 포착하지 못한다고 판단했다. 그는 "액터"라는 개념을 도입한 논문을 발표하며, 계산을 독립적인 에이전트들(액터)이 메시지 전달을 통해 소통하는 과정으로 재정의했다. 이 초기 모델은 상태 캡슐화와 동시성 실행을 핵심 원칙으로 삼았다.
이 이론적 기반은 1980년대 중후반 실용적인 프로그래밍 언어의 등장으로 이어졌다. 가장 두드러진 예는 에릭슨에서 개발한 Erlang 언어다. 통신 시스템과 같은 고가용성, 내결함성이 요구되는 분야에서 실용적으로 검증되며, 액터 모델이 이론을 넘어 산업 현장에 적용될 수 있음을 증명했다. Erlang과 그 프레임워크인 OTP는 액터를 경량 프로세스로 구현하고, 감독 트리 패턴을 통해 시스템 안정성을 강화했다.
2000년대에 들어서며 멀티코어 프로세서가 보편화되면서 동시성 문제가 다시 주목받았고, 액터 모델은 현대적인 부활을 맞이한다. JVM 생태계에서는 스칼라 언어용으로 개발된 Akka 툴킷이 큰 인기를 끌었다. Akka는 Erlang의 설계 철학을 자바와 스칼라로 가져와, 분산 시스템 구축을 위한 강력한 도구로 자리매김했다. 이를 통해 액터 모델은 웹 서비스, 실시간 데이터 처리, 사물인터넷 플랫폼 등 다양한 고동시성 애플리케이션의 핵심 설계 패러다임으로 확고히 자리 잡게 되었다.
3. 기본 개념
3. 기본 개념
3.1. 액터 모델
3.1. 액터 모델
액터 모델은 병행 컴퓨팅과 분산 컴퓨팅을 위한 수학적 모델이자 개념적 프레임워크이다. 이 모델은 칼 휴이트가 1973년 논문에서 최초로 제안했으며, 시스템을 독립적인 액터들의 집합으로 구성한다. 각 액터는 메시지를 주고받으며 동작하는 기본적인 계산 단위로, 상태 캡슐화를 통해 자신의 내부 데이터를 외부로부터 보호한다.
액터 모델의 핵심은 메시지 전달을 통한 통신이다. 액터들은 직접적인 메서드 호출이나 공유 메모리를 사용하지 않고, 비동기적인 메시지를 서로에게 전송하여 상호작용한다. 이때 메시지는 불변의 데이터 구조로, 송신자와 수신자 간의 결합도를 낮추고 시스템의 모듈화를 촉진한다. 이러한 메시지 기반 통신은 위치 투명성을 제공하여, 액터가 로컬 머신에 있든 원격 노드에 있든 동일한 방식으로 통신할 수 있게 한다.
액터 모델은 본질적으로 동시성을 보장한다. 각 액터는 단일 스레드처럼 동작하며, 한 번에 하나의 메시지만 처리한다. 이는 액터 내부에서 락이나 동기화 메커니즘이 필요 없음을 의미하며, 데드락과 같은 문제를 근본적으로 방지한다. 수많은 액터가 병렬적으로 메시지를 처리함으로써 시스템 전체의 높은 동시성을 실현할 수 있다.
이 모델은 내결함성 시스템 구축에 특히 적합하다. 액터 간의 느슨한 결합과 독립적인 생명 주기는 하나의 액터가 실패하더라도 그 영향이 다른 액터로 쉽게 전파되지 않게 한다. 이러한 특성으로 인해 액터 모델은 고가용성이 요구되는 통신 시스템, 금융 거래 플랫폼, 실시간 데이터 처리 파이프라인 등 다양한 분야에서 널리 응용되고 있다.
3.2. 메시지 전달
3.2. 메시지 전달
액터 모델에서 모든 상호작용은 메시지 전달을 통해 이루어진다. 각 액터는 고유한 메일박스를 가지며, 다른 액터는 이 액터의 주소를 알고 있어야만 메시지를 보낼 수 있다. 메시지는 비동기 방식으로 전송되어 송신자의 실행을 차단하지 않으며, 수신자의 메일박스에 큐 형태로 쌓인다. 액터는 자신의 메일박스를 순차적으로 처리하며, 각 메시지에 대해 정의된 행동을 수행한다.
메시지 전달의 핵심 원칙은 공유 메모리를 통한 직접적인 상태 접근을 배제하는 것이다. 액터 간에 데이터를 교환하는 유일한 방법은 불변 메시지를 보내는 것이며, 이는 경쟁 조건이나 데드락과 같은 전통적인 동시성 프로그래밍 문제를 근본적으로 방지한다. 메시지의 내용은 값에 의한 전달이 일반적이며, 참조를 보내는 것은 액터 모델의 철학과 맞지 않는다.
이러한 통신 방식은 위치 투명성을 제공한다. 액터는 메시지를 보낼 때 수신자가 같은 프로세스 내에 있는지, 다른 머신에 있는지 알 필요가 없다. 이는 분산 시스템 구축을 크게 단순화하며, 확장성과 내결함성 설계의 기초가 된다. Erlang이나 Akka와 같은 액터 모델 구현체들은 이러한 투명성을 바탕으로 클러스터 환경에서의 원활한 통신을 지원한다.
메시지 전달은 액터 시스템의 결합도를 낮추고 모듈성을 높인다. 액터는 오직 메시지 인터페이스만을 통해 소통하므로, 내부 구현을 자유롭게 변경할 수 있다. 이는 시스템의 유지보수와 진화에 유리하며, 도메인 주도 설계에서의 바운디드 컨텍스트 간 통신 방식과도 유사한 패러다임을 보여준다.
3.3. 상태 캡슐화
3.3. 상태 캡슐화
액터 모델에서 상태 캡슐화는 각 액터가 자신의 내부 상태를 외부에 직접 노출하지 않고 비공개로 유지하는 핵심 원칙이다. 이는 객체 지향 프로그래밍의 캡슐화 개념과 유사하지만, 동시성과 분산 시스템의 맥락에서 더욱 엄격하게 적용된다. 각 액터는 자신만의 메모리 공간을 가지며, 그 상태는 오직 액터 자신만이 변경할 수 있다.
액터의 상태에 접근하거나 수정하는 유일한 방법은 메시지 전달을 통하는 것이다. 외부의 다른 액터나 프로세스는 직접적으로 상태를 읽거나 쓰지 못하며, 반드시 액터에게 메시지를 보내야 한다. 수신된 메시지에 따라 액터는 자신의 내부 로직을 실행하고, 필요하다면 자신의 상태를 업데이트한 후, 다른 액터에게 응답 메시지를 보낼 수 있다. 이 방식은 공유 메모리 모델에서 발생하는 경쟁 조건이나 데드락 같은 문제를 근본적으로 방지한다.
이러한 강력한 캡슐화는 시스템의 모듈성과 신뢰성을 크게 향상시킨다. 각 액터는 독립적인 단위로 동작하고 실패할 수 있으며, 하나의 액터가 비정상 종료되더라도 그 상태는 캡슐화되어 있기 때문에 다른 액터의 메모리를 손상시키지 않는다. 이는 내결함성 시스템을 구축하는 데 필수적이다. 또한 상태가 메시지 흐름에 의해 제어되므로, 시스템의 동작을 메시지 교환의 관점에서 추론하고 디버깅하기가 더 수월해진다.
따라서 상태 캡슐화는 액터가 분산 컴퓨팅 환경에서 위치 투명성을 갖고 동작할 수 있는 기반을 제공한다. 액터의 상태와 행위가 하나의 단위로 묶여 있기 때문에, 이 액터가 로컬 머신에 존재하든 네트워크 건너 원격지에 있든 상호작용 방식은 동일하게 유지된다. 이는 확장성이 뛰어난 시스템 설계에 중요한 이점이 된다.
3.4. 동시성
3.4. 동시성
액터 모델은 본질적으로 동시성을 핵심으로 하는 프로그래밍 패러다임이다. 각 액터는 독립적인 실행 단위로, 자신만의 상태를 캡슐화하고 다른 액터와 직접적인 상태 공유 없이 비동기 메시지 전달을 통해 소통한다. 이 설계는 액터들이 물리적으로 같은 프로세스 내에 있든, 다른 컴퓨터에 분산되어 있든 상관없이 병렬적으로 동작할 수 있게 한다. 따라서 프로그래머는 스레드나 락과 같은 저수준의 동기화 메커니즘을 직접 관리하는 복잡한 부담에서 벗어나, 메시지 흐름에 집중하여 동시성 문제를 보다 안전하고 직관적으로 해결할 수 있다.
액터 기반 시스템에서 동시성은 액터의 고유한 특성으로부터 자연스럽게 발생한다. 각 액터는 순차적으로 메시지를 처리하며, 한 번에 하나의 메시지만 다루기 때문에 내부 상태에 대한 경쟁 조건이 발생하지 않는다. 이는 액터 내부의 동작을 본질적으로 스레드 안전하게 만든다. 동시에, 수많은 액터 인스턴스들은 시스템 스케줄러나 런타임에 의해 병렬 실행될 수 있어, 전체 시스템 차원에서는 높은 수준의 동시성과 처리량을 달성한다. 이러한 접근 방식은 멀티코어 프로세서의 성능을 효율적으로 활용하는 데 매우 적합하다.
액터 모델의 동시성은 분산 시스템으로의 확장에도 유리하다. 액터 간 통신이 메시지 전달에 기반하고, 액터의 참조가 위치에 독립적(위치 투명성)이기 때문에, 액터의 물리적 위치가 변경되더라도 상호작용 방식은 동일하게 유지된다. 이는 로컬 메모리에서 동작하는 수천 개의 액터를, 추가적인 복잡성 없이 네트워크로 연결된 여러 노드에 분산시키는 것을 가능하게 한다. 결과적으로 액터 모델은 단일 머신의 고동시성 처리부터 지리적으로 분산된 내결함성 시스템 구축에 이르기까지 일관된 프로그래밍 모델을 제공한다.
4. 구현 및 언어
4. 구현 및 언어
4.1. Erlang/OTP
4.1. Erlang/OTP
액터 모델의 가장 유명하고 실용적인 구현체 중 하나는 Erlang 프로그래밍 언어와 OTP 프레임워크이다. Erlang은 원래 에릭슨에서 통신 시스템과 같은 고가용성 및 내결함성이 요구되는 소프트웨어를 개발하기 위해 설계되었다. 이 언어의 핵심 설계 철학은 경량 프로세스를 기반으로 한 액터 모델에 뿌리를 두고 있으며, 수천에서 수백만 개의 프로세스를 효율적으로 생성하고 관리할 수 있도록 만들어졌다.
Erlang에서 각 액터는 독립적인 Erlang 가상 머신 내의 경량 프로세스로 구현된다. 이러한 프로세스들은 완전히 격리되어 있어 하나의 프로세스가 비정상 종료되더라도 다른 프로세스에 직접적인 영향을 미치지 않는다. 프로세스 간의 통신은 비동기적인 메시지 전달을 통해 이루어지며, 메시지 큐를 통해 전달된다. OTP는 이러한 액터 기반 시스템을 구축하기 위한 표준 라이브러리, 설계 원칙, 그리고 행위자(GenServer, GenStatem 등)라는 미리 정의된 동작 패턴을 제공하여 개발자가 내결함성과 분산 처리를 쉽게 구현할 수 있도록 돕는다.
이 조합의 가장 큰 강점은 내결함성과 분산 컴퓨팅에 있다. OTP의 감시 트리 개념은 프로세스가 실패할 경우 이를 감지하고 사전에 정의된 정책에 따라 자동으로 재시작하는 구조를 제공한다. 또한 Erlang/OTP는 노드 간 통신을 투명하게 지원하여, 로컬 프로세스에게 메시지를 보내는 것과 동일한 방식으로 원격 노드의 프로세스와도 소통할 수 있게 한다. 이러한 특성들은 고가용성 시스템, 실시간 시스템, 그리고 대규모 분산 시스템을 구축하는 데 Erlang/OTP가 널리 사용되는 이유가 된다.
4.2. Akka (Scala/Java)
4.2. Akka (Scala/Java)
Akka는 JVM 환경에서 액터 모델을 구현한 오픈 소스 툴킷이자 런타임이다. 주로 Scala와 Java 언어를 위해 개발되었으며, 동시성과 분산성을 갖춘 복잡한 애플리케이션을 쉽게 구축할 수 있도록 설계되었다. Akka는 액터를 기본 프로그래밍 추상화 단위로 사용하며, 개발자가 메시지 전달을 통해 수천 개의 경량 액터를 생성하고 관리할 수 있는 프레임워크를 제공한다. 이를 통해 스레드와 락을 직접 다루는 전통적인 방식보다 더 높은 수준의 추상화에서 동시성 문제를 해결한다.
Akka의 핵심 구성 요소는 액터 시스템, 액터 참조, 메일박스, 감독 전략 등이다. 액터 시스템은 액터들이 생성되고 상호작용하는 계층적 컨테이너 역할을 한다. 각 액터는 고유한 주소를 가지며, 메일박스를 통해 비동기적으로 메시지를 수신한다. Akka는 위치 투명성 원칙을 강력히 지원하는데, 이는 액터가 로컬 머신에 있든 원격 머신에 있든 동일한 방식으로 메시지를 보낼 수 있음을 의미한다. 이 특징은 애플리케이션을 단일 노드에서 분산 시스템으로 확장하는 과정을 크게 단순화한다.
내결함성은 Akka의 중요한 설계 목표 중 하나다. "레저메이션(Let it crash)" 철학을 채택하여, 액터가 실패할 경우 그 액터를 감독하는 상위 액터가 정의된 감독 전략에 따라 복구 작업을 결정한다. 이 방식은 애플리케이션 전체가 중단되는 것을 방지하고 격리된 실패를 처리할 수 있는 고가용성 시스템을 구축하는 데 기여한다. 또한 Akka는 지속적인 메시지 스트림 처리를 위한 Akka Streams 모듈과 클러스터 관리를 위한 Akka Cluster 같은 추가 모듈들을 제공하여 생태계를 확장하고 있다.
Akka는 높은 처리량과 낮은 지연 시간이 요구되는 실시간 시스템, 분산 데이터 처리, IoT 백엔드, 온라인 게임 서버, 금융 거래 플랫폼 등 다양한 분야에서 널리 사용된다. 특히 Lightbend 회사(구 Typesafe)가 주도적으로 개발을 이끌었으며, 리액티브 선언문의 원칙을 구현하는 대표적인 도구로 평가받는다.
5. 장점과 단점
5. 장점과 단점
액터 모델은 동시성과 분산 컴퓨팅 문제를 해결하는 데 있어 몇 가지 뚜렷한 장점을 제공한다. 가장 큰 장점은 상태 캡슐화로 인한 설계의 단순성이다. 각 액터는 자신의 내부 상태를 비공개로 유지하며, 오직 비동기 메시지 전달을 통해서만 다른 액터와 상호작용한다. 이는 공유 메모리를 사용하는 전통적인 스레드 기반 모델에서 흔히 발생하는 경쟁 조건이나 데드락 같은 복잡한 문제를 근본적으로 피할 수 있게 해준다. 또한, 메시지 통신은 위치 투명성을 제공하여, 액터가 로컬 머신에 있든 네트워크를 건너 다른 노드에 있든 상호작용 방식이 동일하게 유지된다. 이는 시스템을 분산 시스템으로 쉽게 확장할 수 있는 기반이 된다.
또 다른 주요 장점은 탄력적인 내결함성 설계가 가능하다는 점이다. 액터 모델은 "실패를 감지하고 위임하라"는 철학을 따른다. 하나의 액터가 오류로 인해 비정상 종료되더라도, 그 액터의 상위 감독자(Supervisor)가 이를 감지하고 사전에 정의된 정책에 따라 복구 조치(예: 액터 재시작)를 취할 수 있다. 이렇게 오류가 국소적으로 격리되고 관리되므로, 시스템 전체의 가용성을 높이는 고가용성 시스템을 구축하기에 적합하다. Erlang/OTP가 전화 교환 시스템 같은 극단적으로 안정성이 요구되는 분야에서 성공을 거둔 이유도 이러한 내결함성 메커니즘 덕분이다.
반면, 액터 모델은 몇 가지 단점과 도전 과제도 안고 있다. 첫째, 디버깅과 시스템 추적이 어려울 수 있다. 수많은 액터가 비동기 메시지를 교환하며 상태가 분산되어 있기 때문에, 특정 시점의 시스템 전체 상태를 이해하거나, 메시지 흐름을 따라가며 버그를 재현하는 것이 전통적인 순차적 프로그램에 비해 복잡하다. 이를 위해 별도의 모니터링 도구와 추적 프레임워크가 필요하다.
둘째, 순수한 메시지 전달 모델이 때로는 성능 오버헤드를 초래할 수 있다. 모든 통신이 메시지 객체를 생성하고 큐를 거쳐 전달되어야 하며, 특히 고빈도로 작은 메시지를 교환할 경우 직렬화와 컨텍스트 스위칭 비용이 무시할 수 없을 정도로 커질 수 있다. 또한, 액터 간에 대량의 데이터를 공유해야 하는 경우, 메시지 복사본을 만들어 전송하는 방식은 메모리 사용량과 대역폭 측면에서 비효율적일 수 있다. 따라서 액터 모델은 많은 수의 경량 프로세스가 비교적 적은 양의 메시지를 교환하는 시나리오에 최적화되어 있다.
6. 응용 분야
6. 응용 분야
6.1. 분산 시스템
6.1. 분산 시스템
액터 모델은 본질적으로 분산 시스템을 구축하기 위한 이상적인 추상화를 제공한다. 각 액터는 독립적인 실행 단위이며 메시지 기반 통신을 통해 상호작용하는데, 이는 네트워크로 연결된 서로 다른 노드 간의 통신 패턴과 매우 유사하다. 액터 시스템의 핵심 원칙인 위치 투명성은 특정 액터가 로컬 메모리에 존재하는지 원격 호스트에 있는지 개발자가 알 필요 없이 동일한 방식으로 메시지를 전송할 수 있게 한다. 이는 시스템을 로컬 동시성 처리에서 지리적으로 분산된 아키텍처로 자연스럽게 확장할 수 있는 기반을 마련한다.
액터 기반 프레임워크는 분산 환경의 복잡한 문제들을 해결하는 데 적합하다. 액터 간의 모든 통신은 비동기 메시지 전달을 통해 이루어지며, 이는 네트워크 지연이나 부분적 실패를 시스템 설계의 일부로 수용한다. 또한, 각 액터가 자신의 상태를 캡슐화하고 직접 공유하지 않기 때문에, 분산 시스템에서 흔히 발생하는 동시성 제어와 락에 관한 문제를 근본적으로 피할 수 있다. 이러한 특성은 클라우드 컴퓨팅 환경이나 마이크로서비스 아키텍처와 같은 현대적인 분산 애플리케이션 개발에 매우 유용하다.
액터 모델을 구현한 대표적인 시스템인 얼랭과 Akka는 분산 시스템 구축을 실용적으로 가능하게 했다. 얼랭의 OTP 프레임워크는 액터 모델 위에 감독 트리와 같은 패턴을 제공하여 분산 환경에서 필수적인 내결함성과 고가용성을 달성한다. Akka는 JVM 환경에서 액터 모델을 구현하여, Java와 Scala 개발자들이 분산되고 탄력적인 시스템을 구성할 수 있는 도구를 제공한다. 이들은 실시간 시스템, 통신 플랫폼, 금융 거래 시스템 등 다양한 분산 애플리케이션의 백본으로 사용된다.
6.2. 고가용성 시스템
6.2. 고가용성 시스템
액터 모델은 고가용성 시스템을 구축하는 데 매우 적합한 아키텍처를 제공한다. 고가용성이란 시스템이 장애 발생 시에도 중단 없이 서비스를 지속할 수 있는 능력을 의미하며, 액터는 이를 실현하기 위한 핵심 메커니즘인 감독 전략과 내결함성을 기본 설계 철학으로 삼고 있다. Erlang/OTP나 Akka와 같은 액터 기반 프레임워크는 액터의 생명주기를 관리하고, 액터 간의 계층 구조를 형성하여 장애를 격리하고 복구하는 체계적인 방안을 제공한다.
이러한 시스템에서 각 액터는 독립적인 실행 단위이며, 자신의 상태를 외부와 공유하지 않는다. 한 액터에서 오류가 발생하더라도 그 영향은 해당 액터로 제한되며, 시스템의 다른 부분으로 전파되지 않는다. 장애를 감지한 감독 액터는 미리 정의된 정책에 따라 문제가 된 자식 액터를 재시작하거나 중지하는 방식으로 시스템 전체의 정상 작동을 유지한다. 이는 전통적인 스레드 기반 동시성 모델에서 하나의 스레드 오류가 전체 프로세스를 중단시킬 수 있는 위험을 효과적으로 해결한다.
액터 모델의 위치 투명성은 고가용성 시스템의 확장과 복구를 용이하게 한다. 액터는 로컬 메모리에 존재하든 원격 머신에 분산되어 있든 동일한 방식으로 메시지를 주고받을 수 있다. 이를 통해 시스템은 단일 서버에서 시작하여 필요에 따라 여러 노드로 쉽게 확장될 수 있으며, 특정 하드웨어의 장애 발생 시에도 액터를 다른 정상 노드로 이전하여 서비스를 빠르게 복구할 수 있다. 이는 클라우드 컴퓨팅 환경과 분산 데이터베이스와 같은 지속성이 요구되는 시스템 구현에 널리 활용된다.
6.3. 실시간 시스템
6.3. 실시간 시스템
액터 모델은 실시간 시스템의 구축에 적합한 아키텍처를 제공한다. 실시간 시스템은 외부 이벤트에 대해 엄격한 시간 제약 내에 응답해야 하는 시스템으로, 항공 교통 관제, 산업 자동화, 통신 장비 등에 활용된다. 이러한 시스템은 예측 가능한 응답 시간과 높은 신뢰성이 요구되며, 액터의 독립적인 메시지 처리와 상태 캡슐화는 데드라인을 준수하는 결정론적 동작을 설계하는 데 유리하다.
액터 기반 실시간 시스템에서는 각 액터가 특정 이벤트나 센서 데이터를 처리하는 담당자 역할을 한다. 예를 들어, 로봇 제어 시스템에서 모터 제어, 장애물 감지, 경로 계획 같은 각각의 하위 작업은 별도의 액터로 구현될 수 있다. 이들은 비동기적으로 메시지를 교환하며, 하나의 액터가 지연되더라도 다른 액터들의 정상적인 실행을 방해하지 않아 시스템 전체의 응답성을 유지할 수 있다.
또한, 액터 모델의 위치 투명성은 실시간 시스템의 확장과 유지보수를 용이하게 한다. 시스템의 일부 기능을 물리적으로 분리된 임베디드 장치로 이전하거나, 처리 부하를 분산시키더라도 액터 간의 통신 인터페이스는 동일하게 유지된다. 이는 에를랑과 OTP 프레임워크가 통신 인프라 분야에서 오랜 기간 성공적으로 사용된 이유이기도 하다.
7. 관련 개념
7. 관련 개념
7.1. 동시성 모델 비교
7.1. 동시성 모델 비교
액터 모델은 동시성과 분산 컴퓨팅을 다루는 여러 패러다임 중 하나이다. 주요 대안으로는 스레드와 락을 기반으로 한 공유 메모리 모델, 이벤트 루프 기반의 비동기 프로그래밍, 그리고 CSP와 같은 다른 메시지 전달 모델이 있다.
공유 메모리 모델은 멀티스레딩 환경에서 뮤텍스나 세마포어 같은 동기화 기법을 사용해 자원에 대한 접근을 제어한다. 이 방식은 데드락이나 레이스 컨디션과 같은 복잡한 문제를 유발할 수 있어 프로그래머의 부담이 크다. 반면 액터 모델은 메시지 전달과 상태 캡슐화를 통해 액터 간에 명시적인 공유 자원이 없으므로, 이러한 문제에서 본질적으로 자유롭다.
CSP는 액터 모델과 유사하게 메시지 전달을 통한 통신을 강조하지만, 중요한 차이가 있다. CSP에서는 통신 채널이 일급 객체이며, 프로세스는 일반적으로 익명이고 채널을 통해 명시적으로 연결된다. 액터 모델에서는 액터 자신이 일급 객체이며, 메시지를 직접 다른 액터의 주소로 전송한다. 또한 액터는 위치 투명성을 제공하여 분산 환경으로의 확장이 더 자연스럽다는 특징이 있다.
7.2. 분산 컴퓨팅
7.2. 분산 컴퓨팅
액터 모델은 본질적으로 분산 컴퓨팅을 염두에 두고 설계된 동시성 모델이다. 각 액터는 고유한 메일박스를 가지며 메시지 전달을 통해 비동기적으로 통신하는데, 이 통신이 동일한 프로세스 내부에서 이루어지든, 서로 다른 머신에 분산되어 있든 동일한 추상화를 제공한다. 이러한 위치 투명성은 시스템을 단일 노드 애플리케이션에서 다중 노드 클러스터로 확장하는 과정을 크게 단순화하는 핵심 원리이다.
액터 기반 시스템은 분산 시스템이 직면하는 전형적인 과제들을 우아하게 해결한다. 액터 간의 모든 상호작용은 불변 메시지를 통해서만 이루어지므로 공유 메모리와 관련된 경쟁 조건이나 데드락 문제가 발생하지 않는다. 또한, 액터의 생명주기를 관리하고 실패를 감지하여 처리하는 감시 메커니즘은 내결함성을 구축하는 표준적인 방법론을 제공한다. 대표적인 구현체인 에를랑의 OTP 프레임워크나 아카는 이러한 패턴들을 토대로 고가용성 분산 애플리케이션을 구축하기 위한 강력한 도구들을 제공한다.
따라서 액터 모델은 클라우드 컴퓨팅 환경과 마이크로서비스 아키텍처와 같은 현대적인 분산 컴퓨팅 패러다임에 매우 적합하다. 시스템 구성 요소를 자연스럽게 액터로 모델링함으로써 개발자는 확장성, 격리, 탄력성을 기본적으로 갖춘 애플리케이션을 설계할 수 있다. 이는 단순한 스레드나 락 기반의 접근법보다 더 높은 수준의 추상화를 통해 복잡한 분산 동시성 문제를 관리할 수 있게 해준다.
8. 여담
8. 여담
액터 모델은 칼 휴이트가 1973년 논문을 통해 처음 제안한 이후, 병행 컴퓨팅과 분산 컴퓨팅의 패러다임을 크게 바꾸었다. 이 모델은 객체 지향 프로그래밍과 유사하게 독립된 엔티티 간의 상호작용을 강조하지만, 공유 메모리를 통한 통신 대신 비동기 메시지 전달을 근본 원리로 삼는다는 점에서 차별화된다.
액터 모델의 설계 철학은 현대 클라우드 컴퓨팅과 마이크로서비스 아키텍처의 발전에 지대한 영향을 미쳤다. 위치 투명성과 강력한 격리 원칙은 시스템 구성 요소를 분리하고, 장애가 전파되는 것을 막아 내결함성을 높이는 데 핵심적인 역할을 한다. 이러한 특성 덕분에 통신 시스템이나 금융 거래 플랫폼 같은 고가용성이 요구되는 분야에서 널리 채택되었다.
액터를 구현한 대표적인 프로그래밍 언어인 얼랭은 에릭슨에서 전화 교환 시스템의 안정성을 보장하기 위해 개발되었으며, 그 실용성이 입증되었다. 이후 아카와 같은 프레임워크가 등장하면서 자바와 스칼라 같은 보다 주류 언어 생태계에서도 액터 모델의 이점을 활용할 수 있게 되었다.
액터 모델은 멀티스레드 프로그래밍의 전통적인 난제인 데드락이나 경쟁 조건 문제를 근본적으로 회피하는 방식을 제공한다. 각 액터가 순차적으로 메시지를 처리하고 상태를 외부에 공유하지 않기 때문에, 복잡한 락 메커니즘 없이도 안전한 동시성을 달성할 수 있다. 이는 함수형 프로그래밍의 불변성 원칙과도 잘 조화를 이루는 접근법이다.
