PHpullh

PYTHON · 디자인패턴

pub/sub 패턴

발행/구독 패턴으로 메시지 기반의 비동기 통신을 구현합니다.

디자인패턴고급pub/sub발행 구독메시지토픽

핵심 설명

발행/구독 패턴으로 메시지 기반의 비동기 통신을 구현합니다.

Python code

from collections import defaultdict
from typing import Callable
import re

class PubSub:
    def __init__(self):
        self._exact: dict[str, list[Callable]] = defaultdict(list)
        self._patterns: list[tuple[str, Callable]] = []

    def subscribe(self, topic: str, callback: Callable):
        if "*" in topic:
            pattern = topic.replace(".", "\.").replace("*", ".*")
            self._patterns.append((pattern, callback))
        else:
            self._exact[topic].append(callback)

    def publish(self, topic: str, message: dict):
        # 정확한 매칭
        for cb in self._exact.get(topic, []):
            cb(topic, message)
        # 패턴 매칭
        for pattern, cb in self._patterns:
            if re.match(pattern, topic):
                cb(topic, message)

# 사용
ps = PubSub()

# 구체적 구독
ps.subscribe("order.created",
    lambda t, m: print(f"  [주문] 새 주문: {m}"))
ps.subscribe("order.paid",
    lambda t, m: print(f"  [결제] 결제 완료: {m}"))

# 와일드카드 구독
ps.subscribe("order.*",
    lambda t, m: print(f"  [감사] {t}: {m}"))
ps.subscribe("*",
    lambda t, m: print(f"  [로그] {t}"))

print("=== 주문 생성 ===")
ps.publish("order.created", {"id": 1, "item": "노트북"})
print("\n=== 결제 ===")
ps.publish("order.paid", {"id": 1, "amount": 1500000})

학습 팁

와일드카드 패턴(order.*)으로 특정 카테고리의 모든 이벤트를 한 번에 구독할 수 있습니다.

주의할 점

너무 많은 와일드카드 구독자가 있으면 성능이 저하됩니다. 필요한 토픽만 정확히 구독하세요.

자주 묻는 질문

pub/sub 패턴란 무엇인가요?

발행/구독 패턴으로 메시지 기반의 비동기 통신을 구현합니다.

pub/sub 패턴 학습 시 주의할 점은 무엇인가요?

너무 많은 와일드카드 구독자가 있으면 성능이 저하됩니다. 필요한 토픽만 정확히 구독하세요.

Continue Learning

Python 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.