확장 가능한 멀티스레드 및 분산 애플리케이션 설계 시, 병렬 액세스 시 안전성과 구성 요소 간 효율적인 상호 작용을 보장하는 패턴이 사용됩니다.
'액터' 패턴 — 각 단위(액터)가 상태를 캡슐화하고 비동기 메시지를 통해서만 다른 단위와 상호 작용하는 모델입니다. 이는 액터가 수신 메시지를 차례로 처리하기 때문에 경쟁 조건을 방지합니다.
'메시지 큐' 패턴 — 개별 구성 요소가 메시지 큐에 데이터를 보내고, 그곳에서 수행자가 이를 추출하는 아키텍처 솔루션입니다. 이는 작업의 버퍼링, 발신자와 수행자 간의 속도 차이 분리 및 과부하에 대한 내성을 제공합니다.
Scala(Akka)의 액터 예시:
class SimpleActor extends Actor { def receive = { case "ping" => sender() ! "pong" } }
Python(RabbitMQ/Pika)의 메시지 큐 예시:
import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() channel.queue_declare(queue='tasks') channel.basic_publish(exchange='', routing_key='tasks', body='Hello')
주요 특징:
액터 간에 공유 상태 객체(Shared State)를 전달할 수 있습니까?
아니요, 액터는 상태를 공유해서는 안 됩니다. 그들은 오직 메시지를 통해 통신해야 하며, 그렇지 않으면 격리의 이점이 상실되고 데이터 경쟁이 발생할 위험이 있습니다.
메시지 큐는 모든 구독자에게 배달 순서를 보장합니까?
아니요, 단일 소비자에 대해 한 큐 내에서만 순서가 보장됩니다. 확장 시(여러 소비자) 수신자 간의 순서는 보장되지 않습니다.
액터와 메시지 큐는 서로 경쟁 관계에 있습니까?
아니요, 이들은 종종 함께 사용됩니다: 액터는 내부 로직(예: 노드 내)용으로, 메시지 큐는 서비스 또는 머신 간의 작업 교환에 사용됩니다.