Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BE] S3와 데이터베이스의 정합성 오류 해결 #820

Open
wants to merge 5 commits into
base: be-dev
Choose a base branch
from

Conversation

Arachneee
Copy link
Contributor

@Arachneee Arachneee commented Nov 8, 2024

issue

구현 사항

상황

데이터베이스에 이미지 메타데이터(파일 이름 등) 를 저장하는 로직과 S3로 이미지 업로드 기능이 다른 트랜잭션으로 분리되어있습니다.

문제

같은 트랜잭션으로 묶이지 않아 원자성이 보장되지 않고 이로 인해 실제 S3에 있지만 데이터베이스에 없는 상황이나 실제 S3에 이미지가 없지만 데이터베이스에 있는 상황이 발생했습니다.

해결

S3에 이미지 업로드 및 삭제 요청을 할 때 에러 발생 시 재시도 로직을 추가합니다. 1초 간격 3회 재시도를 하였고 이후에도 실패 시 성공한 이미지는 다시 삭제 요청을 보냅니다. 또한 보상 트랜잭션을 통해 데이터베이스에 저장된 메타데이터도 삭제합니다.
추가로 삭제 요청도 실패할 수 있고 보생 트랜잭션이 실패할 수 있어 정합성에 오류가 있을 확률이 존재하여 1주일에 한번 스케줄링을 통해 정합성을 맞추는 로직을 동작시킵니다.

재시도 로직의 문제점

  • 문제1 : 최악의 상황에서 이미지 업로드 재시도 3회를 반복하기 때문에 10개의 이미지를 업로드하면 30초 동안의 대기시간이 생길 수 있습니다.
  • 해결1 : 병렬처리를 하여 재시도를 해도 3초로 단축됨.
  • 문제2 : 1개의 이미지 실패 시 전체 다시 삭제 요청을 보내고 재시도 로직 3초가 더 걸려 6초로 최대 대기 시간이 증가합니다.
  • 해결2 : 이미지 삭제 요청은 비동기로 처리하여 최대 대기시간은 3초입니다.
  • 문제3 : 3초도 너무 길다.
  • 해결3 : 이미지 업로드를 완전 비동기로 처리하는 것을 고려할 수 있습니다. 하지만 비동기로 처리할 경우 업로드가 완료되지 않았는데 사용자가 이미지를 요청하면 엑스박스가 나오게됩니다. 그래서 업로드가 완전히 완료된 이후에 알림을 주는 방식을 고려할 수 있습니다.
  • 문제4 : 재시도를 해도 실패할 수 있다.
  • 해결4 : 스케줄링을 통해 데이터 불일치를 맞춰나간다.

@Arachneee Arachneee self-assigned this Nov 8, 2024
@Arachneee Arachneee added ⌨️ BE Backend ⚙️ feat feature labels Nov 8, 2024
Copy link

github-actions bot commented Nov 8, 2024

Test Results

 25 files   25 suites   7s ⏱️
147 tests 147 ✅ 0 💤 0 ❌
151 runs  151 ✅ 0 💤 0 ❌

Results for commit bfd34d5.

♻️ This comment has been updated with latest results.

@Arachneee Arachneee changed the title [BE] S3와 데이터베이스의 이미저 저장여부 정합성 처리 [BE] S3와 데이터베이스의 정합성 오류 해결 Nov 8, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
Status: No status
Development

Successfully merging this pull request may close these issues.

1 participant