Zettelkasten

Outbox와 Job 이력은 분리하는 게 좋다

·수정 2026.04.23·수정 3

요약

  • 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()
    )

참고