ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [번역 서비스] 로직 구현 시 고민한 부분
    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 (로깅 출력)

    댓글

Designed by Tistory.