pile·
백엔드·티몬티몬·

RabbitMQ로 메시지 손실 최소화 하는 법(1)

티몬이 상품 정보 갱신 파이프라인에 RabbitMQ를 도입하며 메시지 손실을 줄이려고 잡은 브로커 설정을 정리한 1부다. 가격이 바뀌었는데 이전 값이 노출되면 안 되는 성격이라 신뢰성에 무게를 뒀다. 클러스터링, 지속성, 큐 미러링 순으로 이어지고 컨슈머 쪽은 2부로 넘긴다.

핵심 포인트
  • 솔루션 선정 기준은 다양한 플랫폼과 언어 지원, 메시지 신뢰성 기능, UI 관리 도구였다.
  • 상품 정보 갱신이 반드시 MQ를 거치므로 메시지가 유실되면 잘못된 가격이 노출된다.
  • 단일 노드는 그 노드가 죽으면 전면 장애가 되므로 여러 노드를 클러스터로 묶는다.
  • 클러스터 노드는 RAM 모드와 DISK 모드를 고를 수 있는데 손실 방지를 위해 DISK 모드를 권한다.
  • Exchange와 Queue에 durable을 주어야 브로커 재시작 후에도 이전 구성이 복원된다.
  • 같은 클러스터라도 큐의 메시지는 공유되지 않으므로 미러링 정책을 걸어야 한다.
상세 정리
  • 도입 배경: 메시지를 발생시키고 받아 처리하는 시스템이 필요했고, 직접 만들 수도 있지만 검증된 솔루션 중에서 고르기로 했다.
  • RabbitMQ 선택 이유: 요구 조건을 충족하면서 유연한 라우팅과 클러스터링을 제공하고 오픈소스이면서 상업적 지원도 가능하다.
  • 적용 흐름: 상품 관리자가 정보를 입력하면 DB에 적재된 뒤 사용자에게 보이는데, 갱신은 반드시 MQ를 통해 메시지를 받아야 반영된다.
  • 신뢰성이 중요한 이유: 가격이 바뀌었는데 이전 가격이 계속 노출되면 큰 사고이므로 운영의 중심을 손실 방지에 둔다.
  • 구성 주체 셋: 메시지를 보내는 프로듀서, 전달하는 브로커, 받아 소비하는 컨슈머로 나뉜다. 1부는 브로커를 다룬다.
  • 클러스터링의 목적: 한 노드가 예기치 못한 오류로 멈추면 상품 정보가 전혀 갱신되지 않는 전면 장애가 되므로 여러 노드로 묶는다.
  • 클러스터 구성 주의점: 모든 노드가 같은 Erlang 쿠키를 갖고 같은 버전의 RabbitMQ와 Erlang으로 돌아야 하며 네트워크는 LAN으로 구성해야 한다.
  • 모드 선택: RAM 모드는 처리 시간이 줄어 성능이 오르지만 영속성을 보장하지 못하고, DISK 모드는 처리 시간이 늘지만 손실을 막는다.
  • 모드 결정: 초당 1~2건 수준이고 큐에 쌓지 않고 즉시 처리하므로 성능을 위해 RAM 모드를 택할 이유가 없다고 판단했다.
  • 지속성 문제: 브로커가 재시작되면 Exchange와 Queue가 이전 정보 그대로 재구성돼야 하는데, 그렇지 않으면 메시지를 보내지도 받지도 못한다.
  • 손실 시나리오: 처리할 Exchange가 없는 상태로 메시지를 보내면 그대로 유실된다. 프로듀서가 Confirm 모드라면 라우팅되지 못했다는 통지는 받을 수 있다.
  • 지속성 설정: exchangeDeclare와 queueDeclare에 durable을 true로 넘겨 재가동 시 복원되게 한다.
  • 미러링의 필요성: 같은 클러스터의 노드라도 큐의 메시지는 서로 다르므로, 한 노드가 멈추면 그 큐의 메시지는 노드가 살아나기 전까지 복구되지 않는다.
  • 미러링 동작: 새 노드가 클러스터에 참여하면 메시지를 제외한 구성은 동일해지지만 큐는 비어 있다. 미러링을 걸어야 다른 노드로도 메시지를 보낼 수 있다.
  • 설정 방법: rabbitmqctl의 set_policy 명령으로 호스트와 정책명, 큐 이름 패턴, 파라미터를 지정해 미러링 정책을 건다.
왜 읽나메시지 유실이 곧 잘못된 데이터 노출로 이어지는 파이프라인이라면 브로커 쪽에서 먼저 잠가야 할 설정 세 가지가 정리돼 있다.
티몬
티몬 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 백엔드·twilio-engTwilio Engineering·

    Programmable Messaging에서 Verify API로 마이그레이션하기

    Twilio의 Programmable Messaging API로 자체 OTP 솔루션을 운영하던 서비스가 Verify API로 전환하는 방법을 코드 예시와 함께 설명한다. Verify는 OTP 전송·검증을 위한 전용 API로, 전화번호 구매, 토큰 생성, DB 저장·만료 관리를 내부에서 처리해 개발자가 직접 구현할 코드를 크게 줄인다.

    요약 이어보기
    #authentication#twilio#sms+2
  2. 백엔드·포스타입포스타입·

    포스타입이 개인화 추천을 하는 방법 2부

    포스타입 백엔드 엔지니어가 벡터 기반 개인화 추천 시스템을 실제 운영하며 맞닥뜨린 성능 장애와 용량 문제를 해결한 과정을 담은 2부다. 수백만 개의 벡터 KNN 검색이 피크 시간대에 전체 Elasticsearch 검색 성능을 흔드는 문제부터 클러스터 OOM 사태까지, 쿼리 최적화와 인프라 분리 두 가지 경로로 근본 해결에 이른다.

    요약 이어보기
    #elasticsearch#vector-search#recommendation-system+2
  3. 백엔드·포스타입포스타입·

    포스타입이 개인화 추천을 하는 방법 1부

    포스타입이 태그 기반 추천의 한계를 극복하고 벡터 임베딩 기반 개인화 추천 시스템을 구축한 과정을 담은 1부다. 유사한 콘텐츠가 다른 용어를 쓰거나 동일한 태그가 전혀 다른 톤의 콘텐츠를 가리키는 문제를 임베딩 벡터로 해결하고, OpenSearch의 HNSW ANN 검색으로 수백만 벡터를 실시간 검색하는 시스템을 구축해 구매율 15% 향상을 달성했다.

    요약 이어보기
    #opensearch#vector-search#recommendation-system+2