메시징 시스템 활용 방식
시스템 간 데이터를 메시지 단위로 비동기 전달하여 서로 직접 연결 없이 통신할 수 있게 해주는 미들웨어입니다.
왜 필요한가?
[동기 방식]
A 서버 → B 서버 직접 호출
→ B가 죽으면 A도 실패
→ B가 느리면 A도 느려짐
→ 강한 결합
[메시징 시스템]
A 서버 → 메시지 큐 → B 서버
→ B가 죽어도 A는 정상 동작 O
→ B가 느려도 A는 영향 없음 O
→ 느슨한 결합
핵심 구성 요소
| 요소 | 설명 |
| Producer | 메시지를 생성하여 전송 |
| Message | 전달되는 데이터 단위 |
| Queue/Topic | 메시지를 저장하는 공간 |
| Consumer | 메시지를 수신하여 처리 |
| Broker | 메시지 전달을 중개하는 서버 |
동작 방식
Producer → [Broker(Queue)] → Consumer
1. Producer가 메시지 발행
2. Broker가 메시지 저장
3. Consumer가 메시지 소비
→ Producer와 Consumer는 서로 모름 (느슨한 결합)
Queue vs Topic
| Queue | Topic |
| 전달 방식 | 1:1 (하나의 Consumer만 수신) | 1:N (여러 Consumer 수신) |
| 메시지 소비 | 하나가 가져가면 삭제 | 구독자 모두에게 전달 |
| 용도 | 작업 분산 | 이벤트 브로드캐스트 |
| 예시 | 주문 처리 | 알림 발송 |
대표 메시징 시스템
| 시스템 | 특징 |
| Kafka | 대용량 처리, 높은 처리량, 메시지 영구 저장 |
| RabbitMQ | 다양한 라우팅, 낮은 지연시간 |
| ActiveMQ | JMS 표준 지원, Java 친화적 |
| Redis Pub/Sub | 초간단 구현, 메시지 저장 안됨 |
장점
| 장점 | 설명 |
| 느슨한 결합 | 시스템 간 의존성 감소 |
| 비동기 처리 | 응답 대기 없이 다음 작업 진행 |
| 부하 분산 | 여러 Consumer가 메시지 나눠 처리 |
| 내결함성 | Consumer 장애 시 메시지 보존 |
| 확장성 | Consumer 수평 확장 용이 |
Java 예시 (Kafka)
// Producer
@Service
public class OrderProducer {
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
public void sendOrder(Order order) {
kafkaTemplate.send("order-topic", order.toJson());
// 전송 후 바로 리턴 (비동기) O
}
}
// Consumer
@Service
public class OrderConsumer {
@KafkaListener(topics = "order-topic")
public void processOrder(String message) {
// 메시지 수신 시 처리
Order order = Order.fromJson(message);
orderService.process(order);
}
}
실사용 예시
주문 서비스 → [주문 메시지] → 재고 서비스
→ 결제 서비스
→ 알림 서비스
→ 각 서비스가 독립적으로 처리 O
메시징 시스템은 마이크로서비스 아키텍처에서 서비스 간 통신의 핵심으로, 직접 API 호출보다 느슨한 결합과 높은 안정성을 제공합니다.