-
[번역 서비스] 로직 구현 시 고민한 부분Work 2025. 1. 30. 22:11
https://fordevelop.tistory.com/218 를 하며 고민한 부분에 대해 정리한 글이다.
Q. 번역 실패 게시글을 어떻게 판별할까?
상황
- 번역 상태 정보는 게시글의 필드로 관리된다. (게시글의 번역 상태 값 : 번역 전, 번역중, 완료)
- 번역상태 != 완료인 게시글을 무조건 번역 실패라고 할 수 있는가?
- 할 수 없다.
- 게시글 수정이 발생했을 때 번역 상태 필드가 초기화된다.
- 번역 지연 시간이 존재하기 때문에 완료 상태가 될 때까지 시간이 소요된다.
방안
- 번역 처리 완료 예상 시간이 지났는데 번역상태 != 완료인 게시글을 번역 실패라고 판단한다.
- 이를 위해 번역 상태 업데이트 시간 정보를 추가한다.
적용
> 게시글의 번역 관련 정보 관리 방식 (필요 정보 : 번역 상태, 번역 상태 업데이트된 시간)
- 1) 번역 상태 로깅 컬렉션 추가
- 번역 관련 데이터를 게시글과 별도로 관리 가능하다.
- 번역 상태 변경 추적이 가능하다.
- 별도 컬렉션으로 관리하기 때문에 write 연산이 추가된다.
- 2) 게시글 컬렉션에 필드로 추가 - 선택!
- 게시글 컬렉션이 커진다.
- 번역 상태 변경 추적이 어렵다.
- 위 방식중 2번째 방식 선택
- 게시글과 분리할 만큼 번역 관련 정보가 많지 않음
- 별도 컬렉션으로 분리할 경우 write 연산이 추가되고 이에 대한 관리 포인트가 증가함
- 번역 상태 추적이 필요한만큼 핏하게 관리되어야 할 값이 아님
> 번역 실패 판별 방식
- 번역 요청 실패
- 번역상태=번역 전, 번역 요청 완료 예정 시간 도달(번역 상태 업데이트 시간 + n분 >= 현재 시간)한 게시글
- 번역 결과 콜백 미수신 및 저장 실패
- 번역상태=번역중, 번역 완료 예정 시간 도달(번역 상태 업데이트 시간 + n분 >= 현재 시간)한 게시글
Q. 번역 재처리 중인 게시글을 중복 조회하지 않으려면 어떻게 할까?
상황
- 스케줄러에 의해 번역 실패 게시글로 조회되어 재처리 중일 때 이후 스케줄러에 의해 동일한 게시글이 추가로 조회될 수 있다.
- 이미 조회되어 재처리 중이기 때문에 동일한 메시지가 중복 발행되는 것은 불필요하다고 판단했다.
적용
- 번역 상태 값에 RETRY를 추가한다. (게시글의 번역 상태 값 : 번역 전, 번역중, 완료, 재시도)
- 재시도 스케줄러에 의해 조회된 게시글의 번역 상태를 RETRY로 업데이트 한다.
- 이후 스케줄러가 번역상태=RETRY인 것은 조회하지 않도록 하여 중복 발행되는 것을 방지한다.
Q. 번역 재처리 시 이전 게시글 버전의 번역이 최신 게시글 버전의 번역을 덮어쓰지 않게 하려면 어떻게 해야할까?
상황
- 번역 과정에는 언어 감지, 번역 요청, 번역 저장이 존재한다.
- 언어 감지 후 게시글의 원문 언어 값을 업데이트 함
- 번역 요청 후 게시글의 번역 상태 값을 업데이트 함 (번역 상태=번역중)
- 번역 결과 콜백을 받아 게시글의 번역을 저장함
- 번역 재처리 중 게시글이 수정되었을 때 재처리 버전의 번역이 최신 버전의 번역보다 이후에 처리될 경우 최신 버전 값을 덮어쓰는 상황이 발생할 수 있다.
적용
- 게시글 버전 값 부여
- 번역 작업 시 번역 대상 게시글 버전 값을 추가한다.
- 번역 재처리 전 게시글 버전 값을 비교해 번역 요청 버전 != 현재 게시글 버전일 때 번역 재처리를 수행하지 않는다.
- 원문 언어, 번역 상태, 번역 결과 업데이트할 때도 쿼리에서 버전 값 비교해 업데이트 여부를 결정하도록 한다.
- 번역 요청 버전 == 현재 게시글 버전 : 업데이트 O
- 번역 요청 버전 != 현재 게시글 버전 : 업데이트 X (로깅 출력)
'Work' 카테고리의 다른 글
[번역 서비스] 적용 - Delayed Retry Topic (0) 2025.01.28 [번역 서비스] 개선 - 번역 실패 모니터링 및 재처리 (0) 2025.01.09 [번역 서비스] 개선 - 번역 실패 모니터링 아키텍처 (0) 2025.01.08 [번역 서비스] 번역 시스템 설계 (0) 2024.12.29