FTP 서버 연결이 끊기는 현상
데이터를 보내는 전송하는 방식 중 하나로 FTP 서버를 활용한다. 단순히 파일을 주고 받는 서버로 개발자라면 누구나 한번 즈음은 사용해봤을 것이다. 대학 강의에서 사용했던 기억이 있는데 요즘에는 잘 모르겠다.
파일 업로드 시 예외 발생
평소에 잘 동작했던 파일 업로드 배치 작업이 실패했다. 두 번, 세 번 실패하 다가 성공을 하거나 계속 실패했다. 원인을 찾기 위해서 로그를 찾아봐도 명확하지 않았다. FTP 서버에 파일을 업로드 하기 전에 작업할 디렉토리로 가는 로직이 있는데, 이 부분에 예외가 발생했다. 파일을 업로드하지 않았음에도 불구하고 예외가 발생해서 원인을 파악하기 어려웠다.
Idle 상태의 연결
에러 로그로 명확하게 원인을 찾을 수 없어서 팀원들과 코드를 분석하기 시작했다. 그러던 중 연결을 맺고 너무 업로드까지의 시간이 너무 오래 걸리는 것이 문제의 원인이 아닐까라는 강한 추측이 제기되었다. 업로드 흐름을 보면 다음과 같다.
- FTP 서버와 연결을 맺는다.
- S3에 저장한 다수의 파일을 가져온다.
- 가져온 다수의 파일을 하나의 큰 파일로 합친다.
- 합친 파일을 FTP 서버로 업로드한다.
2번과 3번 단계에서 파일의 데이터가 커서 작업 시간이 오래 걸린다면 1번에서의 FTP 서버와의 연결이 idle 상태로 남아 있는다. FTP 서버가 이 idle 상태의 연결을 끊었기 때문에 애플리케이션이 4번 작업을 진행할 수 없다. 그 동안 이 흐름에서 문제가 발생하지 않았던 이유는 간단하다. 파일의 데이터가 작았기 때문이다. 데이터가 확장되면서 이 흐름에 결함이 발생한 것이다.
업로드 시 FTP 서버 연결하기
이 문제를 해결하기 위해서는 실제 파일을 업로드 하기 전에 FTP 서버와 연결을 하도록 하는 것이다.
- S3에 저장한 다수의 파일을 가져온다.
- 가져온 다수의 파일을 하나의 파일로 합친다.
- FTP 서버와 연결을 맺는다.
- 합친 파일을 FTP 서버로 업로드한다.
이전 흐름에서 1번 단계를 4번 단계 전으로 바꾸는 것만으로도 이 문제를 손쉽게 해결할 수 있었다.
사실 문제가 없었다면 이 개선 작업은 이뤄지지 않았을 것이다. 사실 많은 부분에서 이와 비슷한 문제를 가진 코드가 존재한다. 항상 최고로 좋은 코드를 작성할 수 없지만, 최선을 다하여 좋은 코드를 지향해야 한다. 그러나 가끔은 이 마음가짐과 다른 작업 결과가 보여 아쉬울 때가 많다. 다시 한번 영화 한 장면에서 나왔던 대사를 떠오른다.
문제 삼지 않으면 문제가 안되는데 문제를 삼으면 문제가 된다고 그랬어요