Skip to content

[#39] 입찰 큐 컨슘 실패 처리와 아웃박스 기반 발행 도입 - #40

Merged
JIWON27 merged 12 commits into
mainfrom
feature/39
Nov 4, 2026
Merged

JIWON27 merged 12 commits into
mainfrom
feature/39

Conversation

@JIWON27

@JIWON27 JIWON27 commented Nov 1, 2026

Copy link
Copy Markdown
Collaborator

개요

입찰 큐(SQS)의 컨슘 실패와 퍼블리싱 실패 처리 보완

컨슘 실패 처리

  • 재시도 가능한 예외(ex.일시적인 DB 오류)는 최대 수신 횟수(기본 3)까지 SQS 재전달 재시도
  • 재시도 불가이거나 재시도를 소진하면 입찰 실패(BID_NOT_PROCESSED)로 응답하고 DLQ로 보내서 같은 경매의 다음 입찰이 막히지 않게 구현
  • DLQ 메시지는 입찰 순서 때문에 원래 큐로 되돌리지 않음 -> DLQ 메시지로 들어온 입찰 요청이 있으면 원인 파악 필요

아웃박스 기반 발행

  • 요청을 outbox에 저장하고 202로 응답하하고 별도 릴레이가 id 순으로 SQS에 발행하도록 변경
  • 발행에 실패하면 순서를 지키기 위해 그 자리에서 멈추고 다음 실행에서 재시도
  • 같은 멱등키 요청은 조회로 먼저 거르고 동시에 들어오면 유니크 제약으로 막아 409로 응답하도록 설정

마감 판단 기준 변경

  • 마감과 연장 판단을 처리 시각이 아니라 접수 시각(requestedAt) 기준으로 바꿔서 마감 전에 접수된 입찰이 큐 대기 때문에 거절되지 않도록 수정

메인 리뷰어 지정 및 Due Date

  • 메인 리뷰어 : blue , Due Date : 2026-11-04

리뷰 시 참고 사항

  • 실패 상황별로 예외를 구분했는데, 구분 기준이 적절한지 궁금합니다.
    • 컨슈머(BidMessageConsumer.isRetryable): 일시적인 DB 오류만 재시도하고, 나머지는 바로 실패 처리 후 DLQ로 보냅니다.
    • 릴레이(OutboxRelay.publish): SQS 발행 실패는 순서를 지키기 위해 멈추고 재시도하고, payload를 읽을 수 없는 경우만 FAILED로 넘깁니다.

TODO

  • 부하 테스트로 기존 구조와 비교
  • 마감 판단을 접수 시각(requestedAt) 기준으로 변경

References

[1] 사용된 레퍼런스에 대한 링크를 남겨주세요.

체크리스트

  • PR 제목을 명령형으로 작성했습니다.
  • PR을 연관되는 github issue에 연결했습니다.
  • 리뷰 리퀘스트 전에 셀프 리뷰를 진행했습니다
  • 변경사항에 대한 테스트코드를 추가했습니다. 또는, 테스트 코드가 필요없는 이유가 있습니다.

@JIWON27 JIWON27 self-assigned this Nov 1, 2026
@coderabbitai

coderabbitai Bot commented Nov 1, 2026 •

Copy link
Copy Markdown

Important

  • Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 30305a25-9183-472e-89d2-d96ea9940604
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@JIWON27
JIWON27 requested a review from blue000927 November 1, 2026 17:48
@JIWON27 JIWON27 linked an issue Nov 1, 2026 that may be closed by this pull request
@sonarqubecloud

sonarqubecloud Bot commented Nov 1, 2026

Copy link
Copy Markdown

Comment on lines +87 to 90
public void validateAcceptingBids(LocalDateTime requestedAt) {
if (!status.isAcceptingBids() || !extendedClosesAt.isAfter(requestedAt)) {
throw new BusinessException(AuctionErrorCode.AUCTION_ALREADY_CLOSED);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

마감 스케줄러가 먼저 실행되면 경매 상태가 변경되어, 마감 전에 접수한 입찰도 거절될 수 있어요. 이 부분은 후속 작업에서 입찰 접수 마감과 최종 낙찰 확정을 분리해주시면 됩니다.

해당 경매에 접수됐지만 결과가 없는 요청이 남아 있으면 최종 확정을 미루고, 처리가 끝난 뒤 연장된 마감 시각을 다시 확인해주세요. outbox의 PENDING뿐 아니라 SQS에 발행됐지만 입찰 결과가 없는 요청도 포함해야 합니다. 요청 저장과 최종 확정에서 같은 경매의 락을 사용하면 확인 직후 요청이 추가되는 경우도 방지할 수 있어요.

Comment on lines +43 to +48
message = jsonConverter.fromJson(outbox.getPayload(), BidMessage.class);
} catch (IllegalArgumentException e) {
log.error("Outbox payload unreadable: id={}, requestId={}", outbox.getId(), outbox.getRequestId(), e);
outbox.markFailed();
outboxRepository.save(outbox);
return true;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

outbox만 FAILED로 변경하면 BidRequestResult가 없어서 결과 조회는 계속 PENDING을 반환합니다. 발행을 포기한 요청은 사용자에게도 실패 결과가 전달되어야 해요.

후속 작업에서는 bidderId와 bidAmount도 outbox의 별도 컬럼에 저장하고, 발행을 최종 실패로 처리할 때 BID_NOT_PROCESSED 결과를 함께 저장해주세요. 그러면 payload를 읽지 못한 경우에도 요청자를 확인하고 실패 결과를 반환할 수 있습니다. outbox 상태와 입찰 결과는 같은 트랜잭션에서 반영해주세요.

@JIWON27
JIWON27 merged commit 224f0fe into main Nov 4, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Task] SQS 퍼플리싱 및 컨슘 로직 보완

2 participants