"매 producer 와 consumer 사이의 매 async middleman.". Message broker 는 매 service 간 매 decouple, 매 buffering, 매 fan-out 을 제공하는 매 infrastructure. 매 2026 의 big three 는 매 Kafka (event streaming), 매 RabbitMQ (traditional queue), 매 NATS (lightweight low-latency). 매 cloud-native 는 SQS / Pub/Sub / EventBridge 도 매 흔함.
매 핵심
매 왜 broker
Decoupling: producer 가 consumer 의 위치/존재 모름.
Buffering: spike 흡수 — consumer 가 천천히 처리.
Fan-out: 1 message → N consumer.
Reliability: persistent queue → consumer crash 후 replay.
매 Core NATS (fire-and-forget) + JetStream (persistence + at-least-once).
매 subject hierarchy: orders.eu.de.
💻 패턴
Kafka producer/consumer (Node.js, kafkajs)
import{Kafka}from'kafkajs';constkafka=newKafka({brokers:['kafka:9092'],clientId:'orders-svc'});// Producer
constproducer=kafka.producer({idempotent:true});// exactly-once-ish
awaitproducer.connect();awaitproducer.send({topic:'orders',messages:[{key:order.userId,// partition key → ordering per user
value:JSON.stringify(order),}],});// Consumer
constconsumer=kafka.consumer({groupId:'fulfillment'});awaitconsumer.subscribe({topic:'orders',fromBeginning:false});awaitconsumer.run({eachMessage:async({message})=>{constorder=JSON.parse(message.value.toString());awaitfulfill(order);// must be idempotent
},});
asyncfunctionhandleMessage(msg){constid=msg.headers['message-id'];// Try insert into processed table — unique constraint on id
constinserted=awaitdb.query('INSERT INTO processed (id, ts) VALUES ($1, NOW()) ON CONFLICT DO NOTHING',[id]);if(inserted.rowCount===0)return;// already processed
awaitbusinessLogic(msg);}
Outbox pattern (transactional publish)
-- Same DB transaction: write business state + outbox entry
BEGIN;UPDATEordersSETstatus='paid'WHEREid=$1;INSERTINTOoutbox(topic,payload,ts)VALUES('orders.paid',$2,NOW());COMMIT;-- Separate process: poll outbox → publish to broker → mark sent
매 결정 기준
상황
Broker
Event streaming, replay, analytics
Kafka
Complex routing, traditional queue
RabbitMQ
Sub-ms latency, microservices
NATS
AWS-native, simple
SQS + SNS
GCP-native
Pub/Sub
Azure-native
Service Bus / Event Hubs
Single-process / dev
Redis Streams, in-memory
기본값: 매 cloud-native team → managed (SQS/Pub-Sub). 매 self-host + event log → Kafka. 매 traditional queue → RabbitMQ.