액터 모델의 핵심 원칙과 Ruby에서의 적용
액터 모델은 전역 상태 없이 비동기 메시지 전달을 통해 독립적으로 작동하는 액터들을 기반으로 합니다. 각 액터는 메시지를 받아 행동을 변경하거나 새로운 액터를 생성할 수 있으며, 메시지는 불변(immutable)이어야 합니다. 가변 상태는 액터 내부에만 존재하며 액터는 상태 머신 역할을 합니다.
Ruby에서는 Celluloid가 대표적인 액터 라이브러리로, Erlang 모델을 차용하여 include Celluloid와 ! 기호를 사용한 비동기 메서드 호출로 메시지 전달을 구현합니다. Rubinius의 표준 라이브러리에도 액터가 포함되어 있으며, Revactor는 이벤트 기반 모델을 사용합니다.
C Ruby의 GIL과 JRuby의 활용
C Ruby는 전역 인터프리터 잠금(GIL)으로 인해 스레드들이 시간 분할 방식으로만 작동하여 진정한 병렬 실행이 어렵습니다. 따라서 액터 모델의 병렬 처리 이점은 JRuby와 같은 다른 Ruby 구현체에서 온전히 활용될 수 있습니다.
다른 언어의 액터 모델 사례
Erlang은 액터 모델을 중심으로 설계된 최초의 상용 언어로, 높은 동시성과 내결함성을 제공합니다. Erlang VM 위에 Ruby와 유사한 문법을 제공하는 Elixir, 그리고 JVM 기반의 Scala(Akka 프레임워크)도 액터 모델을 강력하게 지원합니다.
액터 모델의 장단점
액터 모델은 이해하기 쉽고, 캡슐화를 제공하며, 분산 시스템 구축에 유리합니다. 그러나 코드 분리가 명확하고 데이터 공유가 적은 시나리오에 적합하며, 교착 상태와 같은 동시성 문제가 여전히 발생할 수 있습니다. 소프트웨어 트랜잭션 메모리(STM), CSP 등 다른 동시성 프리미티브도 함께 고려해야 합니다.