한양과학기술고등학교

에듀테크 프로젝트 대시보드

액터 모델 (Actor Model)

1액터 모델이란?

액터(Actor)는 상태 + 행동 + 메일박스(우편함)를 캡슐화한 독립 실행 단위입니다. 액터끼리는 메모리를 공유하지 않고 오직 비동기 메시지로만 통신하며, 자신의 메일박스에 도착한 메시지를 한 번에 하나씩만 순서대로 처리합니다. 그래서 락(lock)이나 뮤텍스 없이도 데이터 경합(race condition)이 원천적으로 생기지 않습니다. Erlang/Elixir, Akka(Scala/Java) 등이 이 모델을 사용합니다.

공유 메모리 + 락 (전통적 스레드)
  공유 변수 balance = 1000
Thread A ↕ lock Thread B ↕ lock Thread C ↕ lock
여러 스레드가 같은 메모리를 직접 읽고 쓰기 때문에, 락을 깜빡하면 경쟁 상태가 생기고 락 순서를 잘못 잡으면 데드락이 생깁니다.
액터 모델 (메시지 전달)
📥 mailbox[msg1, msg2, ...]
⚙️ behavior메시지 1개 처리
🔒 statebalance = 1000
state는 액터 밖에서 절대 직접 접근 불가
다른 액터는 상태를 직접 만질 수 없고 메시지만 보낼 수 있습니다. 각 액터가 메시지를 하나씩 순차 처리하므로 그 액터 내부는 항상 안전합니다.

2핑퐁 액터 데모

Ping과 Pong, 두 액터가 서로에게 메시지를 주고받습니다. 메시지는 즉시 처리되지 않고 상대방의 메일박스에 쌓였다가 순서대로 꺼내져 처리됩니다. "동시에 3번 보내기"를 눌러 메일박스에 메시지가 쌓이는 것도 확인해보세요.

✉️
🏓 Ping
mailbox: 0개
0
🏓 Pong
mailbox: 0개
0
// 메시지 로그가 여기에 표시됩니다

3감독 트리와 "Let it crash"

액터 시스템은 액터들을 트리로 묶고 감독자(Supervisor)가 자식 액터를 지켜봅니다. 자식 하나가 예외로 죽어도 그 실패는 그 액터 안에 격리되고, 감독자가 "one-for-one" 전략으로 해당 액터만 새 상태로 재시작합니다. 다른 형제 액터는 전혀 영향을 받지 않습니다 — 방어 코드를 촘촘히 짜는 대신 "일단 죽게 두고 깨끗하게 재시작"하는 철학입니다.

Supervisor
Worker A
처리한 작업 수
0
Worker B
처리한 작업 수
0
두 Worker의 "작업 처리"를 몇 번 눌러 카운트를 올린 뒤, 한쪽을 크래시시켜 보세요. 크래시한 액터만 상태가 0으로 초기화되어 재시작되고, 나머지 액터의 상태는 그대로 유지됩니다.