Tech

RabbitMQ - SAC(Single Active Consumer)

Jamsun2 2022. 4. 6. 11:33

개요

비동기 작업에서 큐를 사용하려면 중간에 메시지 브로커라는 개념이 존재하는데, 이러한 메시지 브로커에는 RabbitMQ, Kafka등이 있습니다.

해당 포스트는 표준 MQ프로토콜인 AMQP를 구현한 RabbitMQ 3.8과 함께 제공되는 특수한 기능인 SAC에 대해 다룰 것입니다.

SAC에 대해 간략히 정리하면 다음과 같습니다.

  • 대기열에서 SAC를 활성화하면 대기열은 더 이상 경쟁 consumer를 허용하지 않습니다.
  • 하나의 SAC 사용 대기열에는 한번에 메시지를 적극적으로 소비하는 consumer가 하나만 있을 수 있습니다.
  • 첫 번째 consumer가 Active 상태가 되면, 추가 consumer는 대기 상태에 있습니다.
  • Active Consumer가 실패하거나 종료되면 다른 consumer가 "Active" consumer가 되어 소비가 재개됩니다.

 

기술의 발전, 지식의 습득은 문제를 해결하고자 했을 때 생기는 현상이죠?

저도 업무를 하면서 발생한 이슈를 해결하려다 보니 해당 기술에 대해 알게 되었습니다.

 

이런~!!

외부 API를 활용하여 파일을 업로드하고자 했을 때 아래와 같은 문제가 발생했습니다.

  1. 제공되는 API에서는 파일 업로드 시 용량을 제한함
  2. 1의 문제로 파일을 여러 개로 쪼개서 업로드 하는 방식으로 진행
  3. 동일 계정으로 5초 이내 파일 업로드가 불가함
  4. 파일 등록 시 일정 시간 딜레이 처리

 

해결 했나 싶더니 또 문제가...

이렇게 문제가 해결되는 듯 했으나 RabbitMQ를 통해 consumer를 2개로 구성하면서 다시 문제 생깁니다.

 

  1. Producer는 C사에 전송할 파일에 대한 메시지를 1~3개 랜덤하게 메시지 브로커(RabbitMQ)에 전송합니다.
  2. 메시지 브로커는 Round-Robin 분배를 통해 각 consumer에 메시지를 보냅니다.
  3. 각 consumer는 전달받은 메시지를 기반으로 C사에 파일을 전송합니다.
  4. 두개의 consumer는 전송 실패가 항상 발생하지는 않으나 종종 전송 실패가 발생합니다.

 

다중 active 상태, 전송 실패

 

해결을 위한 기술 검토

이 문제를 해결하기 위해, 몇가지 방법들이 제안됩니다.

  • 방안 1. Producer가 메시지를 동시에 전송하지 못하도록 제한을 둔다.
  • 방안 2. 2개의 consumer가 DB의 특정 필드를 보고 업로드가 진행 중일 경우, 업로드를 하지 않도록 한다.
  • 방안 3. 1개의 consumer만 띄우고, 운영자가 계속 모니터링을 하다가 문제가 발생하면 시작(or 재시작)을 진행한다. 

 

내부 회의 결과 방안3으로 의견은 모였지만, 문제는 운영팀에 상시 모니터링 일거리만 늘어나게 되는 상황이었습니다.

이때, 문득 "RabbitMQ에서 처리할 수 있는 방법은 없을까"...라는 고민이 시작되었고,  운좋게도 Single Active Consumer 기능을 찾았습니다.

 

Single Active Consumer 기능

SAC 모드로 설정된 채널은, 1개의 active consumer와 다수의 standby consumer를 갖는 구조이며,

서비스 안정성을 위해 2개 이상의 consumer를 붙여놔도 문제가 없었습니다.

Single active 상태, 전송 성공

 

 SAC 설정 순서는 아래와 같이 간단히 구성할 수 있습니다.

  1. 2개의 consumer를 종료
  2. RabbitMQ에서 메시지큐 삭제
  3. RabbitMQ에서 메시지큐 생성
     - Add queue에서 생성 시 Arguments에 x-single-active-consumer=true - Boolean으로 등록
  4. 생성후 큐 목록에서 "SAC" 아이콘 확인
  5. 2개의 consumer를 실행

RabbitMQ에서 SAC모드 설정

 

 

이상, RabiitMQ의 SAC기능에 대한 간단한 설명이었습니다.

용어 설명

- MQ: Message Queue
SAC: Single Active Consumer 
Producer: 메세지들을 보내는 프로그램은 producer 입니다
Queue: queue는 근본적으로 하나의 큰 메시지 공간입니다. 많은 producer들은 메시지들을 보낼수 있습니다. 메세지들은 하나의 queue로 가고, 많은 consumer들은 하나의 queue로부터 데이터를 받으려고 할수 있습니다. 
Consumer: Consuming 은 receiving에 비슷한 의미를 갖고 있습니다. Consumer는 대부분 메시지들을 받기 위해 대기하고 있는 프로그램입니다.

 

-- written by tech.po@tg360tech.com --