요약
- Outbox는 발행 보장, Job 이력은 처리 결과 추적 - 역할이 다르므로 분리한다
- RQ job은 Redis에 임시 저장되므로, 영구 보존이 필요하면 DB에 기록해야 한다
본문
왜 분리하는가?
RQ job은 영구 보존이 안 된다 - Redis에 저장되고 result_ttl 이후 사라짐
작업 완료 추적이 필요하면 Outbox가 아닌 별도 테이블에서 관리한다.
각 테이블의 역할
[Outbox] [Job History]
- message_id - job_id
- payload - ref_id (order_id 등)
- status (pending/sent) - status (completed/failed)
- retry_count - completed_at
- error
| 구분 | Outbox | Job 이력 |
|---|---|---|
| 역할 | 발행 보장 | 처리 결과 추적 |
| 관심사 | 인프라 계층 | 비즈니스 계층 |
| 생명주기 | 발행 후 삭제 가능 | 영구 보존 |
| 조회 패턴 | pending만 조회 | 결과 조회, 감사 로그 |
처리 완료 기록 예시
@job
def process_order(order_id):
order = Order.get(order_id)
order.send_notification()
# 비즈니스 엔티티에 직접 기록
order.notified_at = now()
order.save()
# 또는 별도 Job 이력 테이블에 기록
JobHistory.create(
job_type='ORDER_NOTIFICATION',
ref_id=order_id,
status='COMPLETED',
completed_at=now()
)