[CS] Reliable Queue 정리 (with Redis)

Hyunjun Kim·2025년 5월 7일
0

Computer_Science

목록 보기
3/19

Reliable Queue 정리 (with Redis)

Reliable Queue란?

작업(데이터)을 처리하는 도중 실패가 발생할 경우를 고려하여 신뢰성 있게 복구 가능한 큐를 말합니다.
단순한 FIFO 큐와 달리 처리 중간 단계 상태를 별도 Queue로 관리하여 작업 유실을 방지합니다.


일반 Queue vs Reliable Queue

항목일반 QueueReliable Queue
개념FIFO 방식으로 단순 작업 처리처리 중 실패 가능성을 고려하여 설계
처리 흐름Queue → WorkerQueue → Processing Queue → Worker
명령 예시RPUSH, LPOPBRPOPLPUSH, LMOVE, BLMOVE
특징빠르고 단순함중간 실패에도 데이터 보존 가능
문제점Worker가 죽으면 데이터 유실실패 복구 가능 (재처리 or DLQ)

Redis 명령어 조합 예시

BRPOPLPUSH job_queue processing_queue
# job_queue에서 작업을 pop하여 processing_queue로 push한다.
# Worker가 작업을 처리한 후 processing_queue에서 해당 작업을 삭제한다.
# 처리 도중 실패하면 작업을 다시 job_queue로 복원하거나 별도 큐로 이동시킨다.


## Reliable Queue 흐름 구조
1. job_queue: 처리 대기 중인 작업 목록이 저장된다.
2. processing_queue: 현재 작업 중인 데이터를 잠시 옮겨둔다.
3. worker: processing_queue에서 데이터를 가져와 실제 처리를 수행한다.

```css
job_queue  --[BRPOPLPUSH]-->  processing_queue
                                      ↓
                                   worker
                                      ↓
                             처리 성공 → 삭제
                             처리 실패 → 복원 or DLQ

실습 예시

redis-cli 기반 Reliable Queue

# 1. job_queue에 작업 추가 (RPUSH: Tail에 추가)
RPUSH job_queue job1 job2 job3
# 2. Worker가 job을 꺼내와서 처리 (BRPOPLPUSH: job_queue → processing_queue)
BRPOPLPUSH job_queue processing_queue
# 결과: "job3"
# job3이 job_queue에서 빠지고, processing_queue의 Head에 들어감
# 3. 작업 처리 성공한 경우: processing_queue에서 제거 (LREM)
LREM processing_queue 1 job3
# job3이 processing_queue에서 제거됨 → 성공적으로 처리 완료
# 4. 실패한 경우: job을 다시 job_queue로 복원 (LREM → LPUSH)
LREM processing_queue 1 job2
LPUSH job_queue job2
# 실패한 job2를 복구
# 5. 큐 상태 확인 (LRANGE)
LRANGE job_queue 0 -1
# 현재 job_queue의 상태를 확인

LRANGE processing_queue 0 -1
# 현재 processing_queue의 상태를 확인
  1. RPUSH로 작업을 큐에 넣는다.
  2. BRPOPLPUSH로 job을 p하고 processing 큐에 push한다 (원자적).
  3. 성공 시 LREM으로 processing 큐에서 제거.
  4. 실패 시 LPUSH로 다시 job 큐에 복원하거나 DLQ에 저장.

관련 개념

Reliable Queue 관련 알아야 할 개념들

개념설명
Processing Queue처리 중인 작업이 임시로 저장되는 큐
Dead Letter Queue (DLQ)실패한 작업들을 따로 저장하여 재검토하는 큐
Acknowledgement작업 성공 여부를 명시적으로 알리는 절차
Blocking Pop작업이 없을 경우 일정 시간 대기 (BRPOP, BLPOP, BLMOVE)
AtomicityLMOVE, BRPOPLPUSH는 한 번의 연산으로 안전하게 수행된다

함께 알아두면 좋은 Queue 유형

유형설명구현 예시
Simple Queue기본적인 FIFO 큐LPUSH + RPOP
Priority Queue우선순위를 기준으로 처리 순서 결정Sorted Set (ZADD)
Delayed Queue특정 시점 이후에만 처리Sorted Set + Timestamp
Work Queue다수의 워커에게 작업을 분산Reliable Queue + Worker Pool
Pub/Sub이벤트를 다수의 구독자에게 전송PUBLISH, SUBSCRIBE
Stream Queue순서가 중요한 로그/이벤트 처리Redis Stream (XADD, XREAD)
profile
Data Analytics Engineer 가 되

0개의 댓글