Feign Client and Messaging system

MONA·2025년 5월 27일

나혼공

목록 보기
70/92

Feign Client vs Messaging system

항목Feign Client (HTTP)Kafka / RabbitMQ (Messaging)
통신 방식동기 (Synchronous)비동기 (Asynchronous)
응답 기대즉시 응답 필요응답 없어도 됨 (Event-driven)
실패 처리호출 시점에서 예외 발생재시도, 큐 적재 등으로 처리
흐름 제어호출자가 제어메시지 큐 또는 브로커가 제어
전송 보장기본은 1회 전송보통 최소 1회 / 정확히 1회 등 보장 설정 가능

Messaging system의 이점

  1. 비동기 처리로 성능 분산

    • 요청을 큐에 넣고 바로 응답할 수 있으므로 서비스 간 병목을 방지할 수 있음
  2. 강한 결합도 해소

    • Feign은 서비스 간의 명확한 인터페이스를 요구함
    • Kafka, RabbitMQ는 이벤트를 발행할 뿐이므로 서비스 간 결합도를 낮출 수 있음
  3. 내결함성(Fault Tolerance) 향상

    • 메시지는 큐/토픽에 쌓이기 때문에 소비자가 잠시 다운되더라도 재처리 가능
    • 서비스에 일시적 장애가 발생해도 데이터 손실 없이 복구할 수 있음
  4. 확장성과 유연한 소비

    • 여러 서비스가 동일한 메시지를 받아 개별 처리 가능(Pub/Sub)
  5. 이벤트 소싱 및 로그 기반 처리 가능

    • Kafka의 경우 메시지 로그를 그대로 유지하므로 이벤트 소싱이나 데이터 복구에 유리함

Messaging system이 더 적합한 경우

  • 대량의 데이터를 비동기 처리해야 할 때
  • 소비자가 많거나 한 번에 여러 서비스에서 메시지를 구독해야 할 때
  • 즉각적인 응답이 필요 없는 이벤트일 때
  • 서비스 간 결합도를 줄이고 확장성을 높이고 싶을 때

Feign이 더 적합한 경우

  • 요청-응답 패턴이 명확히 필요한 경우
  • 에러를 즉시 받아 사용자에게 처리해야 하는 경우
  • 간단한 서비스 간 통신

주문->결제 와 같이 결과가 즉시 필요한 경우 Feign으로 동기 처리
주문->배송 시작, 알림 전송 과 같은 경우는 Kafka/RabbitMQ로 비동기 처리
데이터 집계, 로그 저장, 알림 브로드캐스트 의 경우에는 Kafka(pub/sub) 이용

Kafka vs RabbitMQ

구분KafkaRabbitMQ
메시징 모델로그 기반 Pub/Sub큐 기반 Message Broker
주 사용 목적스트리밍, 이벤트 소싱, 대규모 로그 처리일반적인 비동기 메시징, 작업 큐
처리량 (Throughput)매우 높음 (수십만 TPS 가능)중간 (수천~수만 TPS 적정)
지연 시간 (Latency)낮음, 하지만 기본적으로는 일괄 처리 중심낮음, 단건 메시지 처리에 강함
메시지 보관메시지를 오래 저장 (디스크 기반 로그 유지)소비 후 삭제 (기본값)
내구성 / 장애 복구높은 내구성 (다중 브로커, 로그 복구)HA 설정 시 복구 가능하지만 기본은 큐 중심
메시지 순서 보장파티션 내 순서 보장큐 내 순서 보장 (하지만 소비자가 많으면 순서 깨질 수 있음)
컨슈머 처리 방식Pull 방식 (컨슈머가 직접 가져감)Push 방식 (브로커가 보내줌)
운영 복잡도상대적으로 높음 (Zookeeper or KRaft)상대적으로 낮음

Kafka와 RabbitMQ 선택 기준

1. 데이터 처리량이 많고 스트리밍이 필요한 경우 -> Kafka

  • 대량의 이벤트/로그를 실시간으로 처리해야 할 때

  • 메시지를 수일~수주 간 저장하고 다시 소비해야 할 때

  • 이벤트 소싱(event sourcing)이나 CDC(Change Data Capture)이 필요할 때

  • 다수의 컨슈머가 동일 메시지를 독립적으로 소비해야 할 때

    ex) 주문 로그 분석, 사용자 행동 추적, 실시간 대시보드, 로그 집계

    +CDC: 데이터베이스의 변경 사항을 감지하여 실시간 또는 근실시간으로 다른 시스템으로 전파하는 기술
    MSA에서 서비스 간 데이터 동기화, 분산 시스템 간 실시간 연동, 이벤트 기반 아키텍처에서 데이터베이스 변경을 트리거로 사용하는 등의 경우에 필요

2. 즉각적인 메시지 처리, 단순한 비동기 큐가 필요한 경우 -> RabbitMQ

  • 빠른 반응성과 단순한 메시지 전달이 중요할 때

  • 요청에 따라 작업을 큐잉하고 워커가 처리하는 구조일 때

  • 동일 메시지를 여러 컨슈머가 공유해서 처리하지 않아도 될 때

  • 복잡한 메시지 라우팅(Exchange <-> Queue 바인딩)이 필요할 때

    ex) 이메일 전송, 알림 메시지 큐, 백그라운드 작업 처리

profile
고민고민고민

0개의 댓글