[Knot] 정체 모를 녹음 종료 이슈 해결 과정

이 글의 목차7개
  1. 문제점
  2. 1. 이유를 알 수 없는 연결 끊김 문제
  3. 2. 연결 상태와 녹음 종료를 나누기
  4. 정상 종료 정책과 구분하기
  5. 3. 돌아온 사용자가 같은 녹음을 이어가려면?
  6. 새 페이지에서만 녹음을 제어하기
  7. 저장하지 못한 음성부터 다시 보내기

문제점

사용자가 종료 버튼을 누르지 않았는데 녹음이 끝나는 문제가 계속 일어났습니다.

서버에는 CONNECTION_EXPIRED가 기록돼 있었습니다.
브라우저가 보내는 생존 신호인 하트비트가 끊겨 녹음을 종료했다는 뜻이었습니다.
당시 최근 14일 기록에서 이런 종료가 29건 확인됐습니다.

이런 에러 상황을 재현하려고 했지만, 이유를 찾아내는 것이 쉽지 않았습니다.

이번 글에서는 연결 유실의 원인을 살펴보다가, 연결이 끊겼을 때 녹음을 어떻게 다룰지 정책부터 바꾸게 된 과정을 정리했습니다.

1. 이유를 알 수 없는 연결 끊김 문제

사용자에게 공통적으로 피드백 받은 문제 상황 묘사는 노트북을 덮지 않고 크롬이 계속 열려있었는데, 녹음이 갑자기 종료됐다. 였습니다.

찾아보니, 다음과 같이 이유는 여러가지가 있을 수 있었습니다.

  • 백그라운드 탭의 타이머 지연
  • 브라우저의 탭 정지 / 메모리 회수
  • 브라우저가 다른 작업을 오래 수행함
  • 일시적인 요청 실패

네트워크가 끊겼을 수도 있고, 사용자가 탭을 닫았을 수도 있었습니다. 기기가 잠자기에 들어갔거나 브라우저의 설정과 정책이 영향을 줬을 가능성도 생각했습니다. 하지만 확인한 서버 기록만으로 각각의 원인을 구분하지는 못했습니다.

2. 연결 상태와 녹음 종료를 나누기

이 문제를 해결하기 위해서는 탭을 닫고 떠난 사용자(정상 종료 플로우)의 녹음은 종료시키되, 인터넷 연결이 잠시 끊긴 사용자는 같은 녹음을 이어갈 수 있는 정책을 만들어야 했습니다.

먼저 생각했던 것은 하트비트 제한을 늘리는 것이었지만, 연결이 끊긴 사실은 사용자에게 알려야 하고, 돌아오지 않는 녹음은 언젠가 끝내야 했습니다. 
그래서 팀과 함께 끊김을 표시하는 기준과 녹음을 종료하는 기준을 따로 정했습니다.

상황 변경한 정책
30초 동안 생존 신호가 없음 연결 끊김으로 표시하고 녹음은 바로 종료하지 않음
마지막 생존 신호 이후 30분 안에 복귀 같은 녹음을 이어받을 수 있도록 허용
30분 동안 생존 신호가 없음 녹음 종료

무한정 기다리지는 않으면서 연결이 돌아올 여지를 주려는 기준이었습니다.

또한, 연결 여부도 하트비트 하나로만 판단하지 않도록 했습니다. 
음성 업로드 예약이나 완료 요청이 오고 있다면 브라우저가 서버와 통신하고 있다는 뜻이므로, 음성 업로드 요청도 마지막 생존 시각에 반영했습니다.

정상 종료 정책과 구분하기

Knot은 한 회원이 여러 녹음을 동시에 시작하지 못하게 합니다. 유예만 늘리면 탭을 닫고 다시 들어온 사용자가 최대 30분 동안 새 녹음을 시작하지 못할 수 있었습니다.

그래서 다른 탭에서 기존 녹음을 끝내는 동작은 유지했습니다. 기존 녹음을 이어갈 사람에게는 시간을 주고, 새로 시작하려는 사람은 직접 끝내고 시작할 수 있도록 했습니다.

3. 돌아온 사용자가 같은 녹음을 이어가려면?

수정된 정책에 맞춰 사용자가 같은 탭을 새로고침한 뒤에도 기존 녹음을 이어갈 수 있어야 했습니다. 
이를 위해 두 정책을 추가했습니다.

새 페이지에서만 녹음을 제어하기

새 페이지에서 녹음을 이어가고 있는데, 이전 페이지의 종료 요청 때문에 다시 끝나면 안 되기에, 녹음을 이어받을 때 제어 토큰을 새것으로 교체하고, 이전 토큰으로 온 요청은 거절했습니다. 새 페이지에서 보낸 요청만 녹음 상태를 바꿀 수 있도록 수정했습니다.

저장하지 못한 음성부터 다시 보내기

다음으로는 어디부터 음성을 다시 보낼지 정했습니다. 업로드를 예약했더라도 실제 파일이 저장되지 않을 가능성이 있었습니다.

예를 들어 1번과 2번은 저장됐지만 3번이 빠졌다면, 4번이 저장돼 있어도 3번부터 다시 받아야 했기에, 처음부터 빠짐없이 저장된 지점까지 확인하고, 그다음부터 다시 보내도록 했습니다.

순번이나 음성 위치가 이어지지 않거나, 저장이 확인되지 않은 조각을 만나면 그 자리에서 멈춥니다. 이 작업을 통해 중간에 빠진 음성을 건너뛰지 않고 이어받을 수 있습니다.

전체 글 보기