ZeroMQ(ØMQ)는 브로커 없이 동작하는 고성능 비동기 메시징 라이브러리다. 소켓 추상화 위에 메시지 큐 패턴을 구현하며, 네트워크 프로그래밍을 단순화한다.
소켓 패턴
| 패턴 | 소켓 쌍 | 용도 |
|---|
| Request-Reply | REQ-REP | 동기 RPC |
| Publish-Subscribe | PUB-SUB | 브로드캐스트 |
| Push-Pull | PUSH-PULL | 파이프라인, 부하 분산 |
| Dealer-Router | DEALER-ROUTER | 비동기 RPC, 라우팅 |
| Pair | PAIR-PAIR | 1:1 독점 통신 |
python
import zmq
import threading
import time
# === Push/Pull 패턴 (작업 분산) ===
def ventilator():
"""작업 생성자"""
ctx = zmq.Context()
sender = ctx.socket(zmq.PUSH)
sender.bind("tcp://*:5557")
for task_id in range(100):
sender.send_json({"task_id": task_id, "data": "work"})
ctx.term()
def worker(worker_id):
"""작업 처리"""
ctx = zmq.Context()
receiver = ctx.socket(zmq.PULL)
receiver.connect("tcp://localhost:5557")
sender = ctx.socket(zmq.PUSH)
sender.connect("tcp://localhost:5558")
while True:
task = receiver.recv_json()
result = {"worker": worker_id, "task": task["task_id"], "result": "done"}
sender.send_json(result)
def sink():
"""결과 수집"""
ctx = zmq.Context()
receiver = ctx.socket(zmq.PULL)
receiver.bind("tcp://*:5558")
for _ in range(100):
result = receiver.recv_json()
print(f"Result: {result}")
# === Pub/Sub 패턴 ===
def publisher():
ctx = zmq.Context()
pub = ctx.socket(zmq.PUB)
pub.bind("tcp://*:5556")
while True:
pub.send_multipart([b"weather.kr", b'{"temp": 22, "humidity": 60}'])
pub.send_multipart([b"weather.us", b'{"temp": 18, "humidity": 55}'])
time.sleep(1)
def subscriber(topic):
ctx = zmq.Context()
sub = ctx.socket(zmq.SUB)
sub.connect("tcp://localhost:5556")
sub.setsockopt(zmq.SUBSCRIBE, topic.encode()) # 토픽 필터
while True:
[topic, msg] = sub.recv_multipart()
print(f"[{topic.decode()}] {msg.decode()}")
관련 문서