• 계속 작성중인 글입니다. 피드백 환영합니다.

문제 발생

우리 서비스에서 동물 등록을 진행하려면, 동물 보호 시스템에서 다운로드 받은 엑셀 파일을 파싱하여 우리 DB에 업로드 한다.
이 때, 적게는 수십 개, 많게는 수백 개 이상의 동물 등록 데이터를 API 서버에 HTTP 리퀘스트로 보낸다.

최근 업로드한 데이터가 DB에 있던 기존 데이터와 맞는지 검사하는 로직이 추가되면서, 동물 등록 관련 프로세스가 헤비해졌다.
엑셀에 있는 데이터를 통으로 서버로 보내서 비교하기 때문에, 패킷도 무겁고 로직도 무겁다.

이로 인해 200건 이상의 데이터를 리퀘스트했을 때 에러 발생이 많아졌다.
에러 메시지는 502 Bad gateway. CORS 관련 에러 메시지였다.

원인 파악

CORS 관련 에러는 서버, 로드밸런서로 인해 생길 수 있는데, 삽질을 하며 파악해본 결과 로드밸런서의 문제로 파악했다.

다음 두 가지 원인으로 502 에러가 발생했다.

  • 클라이언트 - 로드밸런서 사이에 한 번에 너무 많은 리퀘스트를 보낼 때
  • 로드밸런서 - 서버 사이에 keep alive timeout이 끝나서 커넥션이 끊긴 상태인데 또 리퀘스트를 시도할 때

해결

  • 클라 - 로드 밸런서 사이에는 리퀘스트 갯수가 50개 이상일 경우, 리퀘스트를 50개씩 끊어서 보내도록 구현했다. (전체 프로미스 - 내부 50개씩 보내는 프로미스로 비동기 처리)
  • 로드밸런서 - 서버 사이에는 keep alive timeout 관련 설정을 추가해서 해결했다.

결론

힘들었던 점은, 나는 클라이언트-로드밸런서 / 혹은 로드밸런서-서버 둘 중 하나만 해결하면 문제가 해결될 줄 알았는데, 그렇지는 않았다는 점이다.

마지막에 지푸라기라도 잡는 심정으로, 클라, 서버 둘 다 처리한 걸 테스트해보니까 문제가 해결됐다.
어쩌면 ELB 관련 설정을 잘 해주면 단번에 해결될 문제였을지도 모르겠다. ELB 관련 공부가 더 필요하다.

테스트 환경과 라이브 환경이 다른 것도 이번 삽질의 원인이었던 거 같으니, 연습을 실전처럼 하자고 건의해야겠다.
버그 해결에는 다양한 시도와 창의적인 생각이 필수적인듯!