Skip to content

[Reliability] 이벤트 유실 방지·재처리 기반 구현 #25

Closed

Description

@hywznn

한 줄 목표

DB 상태 변경 직후 Server가 종료되거나 handler가 실패해도 후속 작업을 잃지 않고, 중복 전달에도 업무 결과가 한 번만 만들어지도록 합니다.

초보자용 설명

Task 생성·취소와 “다음에 처리할 이벤트”를 따로 저장하면 중간 종료 때 하나만 남을 수 있습니다. 같은 transaction 안에 두 내용을 저장하고, 실패하거나 서버가 재시작되면 안전하게 이어서 처리합니다.

확정한 기술 선택

  • DomainEventPublisher Port 뒤에 PostgreSQL Transactional Outbox adapter를 사용합니다.
  • event_publication은 처리할 이벤트, event_consumption은 handler별 완료 기록입니다.
  • Spring Boot 4.1에서 lease·실패 분류·backoff·handler별 멱등성을 명시적으로 통제합니다.
  • MVP에서는 Kafka/RabbitMQ와 별도 Testcontainers 의존성을 추가하지 않습니다.
  • 실제 PostgreSQL 검증은 저장소의 기존 GitHub Actions PostgreSQL 17 service를 사용합니다.

Event envelope

  • eventId, eventType, payloadVersion
  • aggregateType, aggregateId, companyId
  • actorType, 안전한 actorId
  • requestId, traceId, occurredAt
  • 기능별 allow-list를 통과한 최소 payload

JWT, Link 원문 token, 여권·외국인등록·전화·계좌번호, 비밀번호, 전체 Prompt를 넣지 않습니다.

구현 범위

  • DB 변경과 publication record를 한 transaction으로 저장
  • 상태·시도 횟수·다음 시각·완료/안전한 오류 코드 저장
  • restart 시 lease 만료 record 자동 회수
  • handler별 완료 receipt, unique constraint, optimistic lock
  • 지수 backoff와 최대 시도 후 REVIEW_REQUIRED 전환
  • 원자성·재시작·중복 전달·영구 실패 통합 테스트
  • PostgreSQL 17 migration·FK·CHECK·UNIQUE·index CI 테스트
  • backlog·oldest delay·retry·review required metric
  • Task 생성·취소 event를 실제 업무 transaction에 연결
  • 초보자용 개발·운영·장애 복구 문서 작성

AI retry와 섞지 않기

완료 조건

  • DB 변경과 publication 사이 유실 구간이 없습니다.
  • handler 실패와 Server restart 뒤 자동 복구됩니다.
  • 같은 event를 두 번 받아도 완료된 handler 결과가 중복되지 않습니다.
  • 영구 실패를 성공으로 위장하지 않고 requestId/traceId로 찾을 수 있습니다.
  • 개인정보가 event/log/metric label에 없습니다.
  • 전체 H2 테스트·실행 JAR 빌드·GitHub PostgreSQL CI가 통과합니다.

진행 상황

관계

Activity

  1. added
    area:serverSpring Boot API·도메인·DB·tenant·Task Workflow 영역; Prompt·모델·Provider 구현 제외
    area:infraServer Dockerfile·DB 설정·CI hook·배포 가능성 영역; 통합 인프라 운영은 infra 저장소와 조율
    priority:P0MVP 진행을 막는 최우선 핵심 작업
    status:blocked선행 작업이나 외부 조건 때문에 현재 진행할 수 없는 작업
    type:tooling테스트·검증·CI·개발 편의 도구 작업
    on Jul 21, 2026
  2. added
    type:integration외부 LLM·DB·스토리지 등 시스템 간 연동 작업
    and removed
    type:tooling테스트·검증·CI·개발 편의 도구 작업
    on Jul 21, 2026
  3. self-assigned this
    on Jul 22, 2026
  4. added
    status:ready범위가 확정되어 바로 시작할 수 있는 작업
    and removed
    status:blocked선행 작업이나 외부 조건 때문에 현재 진행할 수 없는 작업
    on Jul 24, 2026
  5. added
    status:in-progress담당자가 현재 구현 중인 작업
    status:in-review구현을 마치고 리뷰 또는 병합을 기다리는 작업
    and removed
    status:ready범위가 확정되어 바로 시작할 수 있는 작업
    status:in-progress담당자가 현재 구현 중인 작업
    on Jul 24, 2026
  6. removed
    status:in-review구현을 마치고 리뷰 또는 병합을 기다리는 작업
    on Jul 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:infraServer Dockerfile·DB 설정·CI hook·배포 가능성 영역; 통합 인프라 운영은 infra 저장소와 조율area:serverSpring Boot API·도메인·DB·tenant·Task Workflow 영역; Prompt·모델·Provider 구현 제외priority:P0MVP 진행을 막는 최우선 핵심 작업type:integration외부 LLM·DB·스토리지 등 시스템 간 연동 작업

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions