Reliable Queue 정리 (with Redis)
Reliable Queue란?
작업(데이터)을 처리하는 도중 실패가 발생할 경우를 고려하여 신뢰성 있게 복구 가능한 큐를 말합니다.
단순한 FIFO 큐와 달리 처리 중간 단계 상태를 별도 Queue로 관리하여 작업 유실을 방지합니다.
일반 Queue vs Reliable Queue
항목 | 일반 Queue | Reliable Queue |
---|
개념 | FIFO 방식으로 단순 작업 처리 | 처리 중 실패 가능성을 고려하여 설계 |
처리 흐름 | Queue → Worker | Queue → Processing Queue → Worker |
명령 예시 | RPUSH , LPOP | BRPOPLPUSH , 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
RPUSH job_queue job1 job2 job3
BRPOPLPUSH job_queue processing_queue
LREM processing_queue 1 job3
LREM processing_queue 1 job2
LPUSH job_queue job2
LRANGE job_queue 0 -1
LRANGE processing_queue 0 -1
- RPUSH로 작업을 큐에 넣는다.
- BRPOPLPUSH로 job을 p하고 processing 큐에 push한다 (원자적).
- 성공 시 LREM으로 processing 큐에서 제거.
- 실패 시 LPUSH로 다시 job 큐에 복원하거나 DLQ에 저장.
관련 개념
Reliable Queue 관련 알아야 할 개념들
개념 | 설명 |
---|
Processing Queue | 처리 중인 작업이 임시로 저장되는 큐 |
Dead Letter Queue (DLQ) | 실패한 작업들을 따로 저장하여 재검토하는 큐 |
Acknowledgement | 작업 성공 여부를 명시적으로 알리는 절차 |
Blocking Pop | 작업이 없을 경우 일정 시간 대기 (BRPOP , BLPOP , BLMOVE ) |
Atomicity | LMOVE , 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 ) |