스레드 뮤텍스(Mutex)의 한계를 깨는 액터 모델(Actor Model) 동시성 제어 아키텍처
과거 실시간 멀티플레이어 게임 서버를 개발할 때 가장 저주스러웠던 단어는 '데드락(Deadlock)'과 '레이스 컨디션(Race Condition)'이었습니다. 수백 명의 유저가 한 몬스터를 동시에 타격할 때 몬스터의 HP(상태)를 안전하게 깎으려면 뮤텍스 잠금(Lock)이 필수적이었고, 락의 범위가 잘못 설정되는 순간 서버의 스레드들은 서로를 영원히 기다리며 멈춰버렸습니다.
이 지긋지긋한 공유 메모리(Shared Memory) 파멸의 고리를 끊어낸 것이 바로 액터 모델(Actor Model)의 도입이었습니다. 액터 모델 철학은 객체 지향 프로그래밍의 극단적 형태입니다. '액터'라 불리는 작고 독립적인 컴퓨팅 단위들은 절대 서로의 변수(상태)를 직접 들여다보거나 조작할 수 없습니다. 대신 그들은 우체통(Mailbox)을 달고 있으며, 오로지 불변(Immutable) 상태의 비동기 메시지를 던지고 받는 것으로만 소통합니다. 몬스터 액터는 유저 액터들에게 "내가 널 때렸다"라는 텍스트 메시지만 던질 뿐, 몬스터가 락을 걸고 데미지 계산을 대기할 필요가 전혀 없습니다. 메시지가 도착하면 수신자 액터가 알아서 자기 혼자 싱글 스레드처럼 순차적으로 편지를 뜯어보며 자신의 HP를 업데이트합니다.
메모리를 '공유'하여 소통하는 것이 아니라, 소통(메시지)함으로써 메모리를 '동기화'한다는 이 코페르니쿠스적 발상의 전환은 놀라웠습니다. Akka 프레임워크를 도입한 이후 단 1바이트의 Mutex 락 코드도 없이 100만 개의 액터 객체가 하나의 JVM 위에서 충돌 제로의 상태로 구동되었습니다. 동시성 프로그래밍의 본질은 상태의 잠금(Locking)이 아니라 상태의 능동적 고립(Isolation)에 있다는 깨달음을 얻게 된 강렬한 패러다임 시프트였습니다.
Related Posts
JVM JIT 컴파일러의 극단적 런타임 최적화: 탈출 분석(Escape Analysis)과 스칼라 치환의 마법
정적 컴파일 언어를 압도하는 자바 머신의 동적 스크립트 프로파일링 및 객체 힙 버림 최적화 기법.
리눅스 eBPF와 XDP를 활용한 커널 바이패스(Kernel Bypass) 초저지연 패킷 필터링 아키텍처
운영체제 네트워크 스택의 병목을 우회하여 디바이스 드라이버 레벨에서 직접 샌드박스 코드를 주입하는 eBPF의 혁명.
스플릿 브레인(Split-Brain) 붕괴를 막는 분산 락(Distributed Lock) 시스템과 펜싱(Fencing) 토큰의 도입
Zookeeper, Redis Redlock의 시계 위임 맹점을 찌르는 가비지 컬렉션 시간 정지(Stop-the-World) 현상 롤백 설계.