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 패턴 학습 시 주의할 점은 무엇인가요?
너무 많은 와일드카드 구독자가 있으면 성능이 저하됩니다. 필요한 토픽만 정확히 구독하세요.