{"componentChunkName":"component---src-templates-post-template-js","path":"/posts/fix-elb-error","result":{"data":{"markdownRemark":{"id":"9caa6fcb-50f6-5711-b786-43d824b35275","html":"<h3 id=\"문제-발생\" style=\"position:relative;\"><a href=\"#%EB%AC%B8%EC%A0%9C-%EB%B0%9C%EC%83%9D\" aria-label=\"문제 발생 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>문제 발생</h3>\n<p>우리 서비스에서 동물 등록을 진행하려면, 동물 보호 시스템에서 다운로드 받은 엑셀 파일을 파싱하여 우리 DB에 업로드 한다.\n이 때, 적게는 수십 개, 많게는 수백 개 이상의 동물 등록 데이터를 API 서버에 HTTP 리퀘스트로 보낸다. </p>\n<p>최근 업로드한 데이터가 DB에 있던 기존 데이터와 맞는지 검사하는 로직이 추가되면서, 동물 등록 관련 프로세스가 헤비해졌다.\n엑셀에 있는 데이터를 통으로 서버로 보내서 비교하기 때문에, 패킷도 무겁고 로직도 무겁다. </p>\n<p>이로 인해 200건 이상의 데이터를 리퀘스트했을 때 에러 발생이 많아졌다.\n에러 메시지는 502 Bad gateway. CORS 관련 에러 메시지였다. </p>\n<h3 id=\"원인-파악\" style=\"position:relative;\"><a href=\"#%EC%9B%90%EC%9D%B8-%ED%8C%8C%EC%95%85\" aria-label=\"원인 파악 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>원인 파악</h3>\n<p>CORS 관련 에러는 서버, 로드밸런서로 인해 생길 수 있는데, 삽질을 하며 파악해본 결과 로드밸런서의 문제로 파악했다.</p>\n<p>다음 두 가지 원인으로 502 에러가 발생했다.</p>\n<ul>\n<li>클라이언트 - 로드밸런서 사이에 한 번에 너무 많은 리퀘스트를 보낼 때</li>\n<li>로드밸런서 - 서버 사이에 keep alive timeout이 끝나서 커넥션이 끊긴 상태인데 또 리퀘스트를 시도할 때</li>\n</ul>\n<h3 id=\"해결\" style=\"position:relative;\"><a href=\"#%ED%95%B4%EA%B2%B0\" aria-label=\"해결 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>해결</h3>\n<ul>\n<li>클라 - 로드 밸런서 사이에는 리퀘스트 갯수가 50개 이상일 경우, 리퀘스트를 50개씩 끊어서 보내도록 구현했다. (전체 프로미스 - 내부 50개씩 보내는 프로미스로 비동기 처리) </li>\n<li>로드밸런서 - 서버 사이에는 keep alive timeout 관련 설정을 추가해서 해결했다.</li>\n</ul>\n<h3 id=\"결론\" style=\"position:relative;\"><a href=\"#%EA%B2%B0%EB%A1%A0\" aria-label=\"결론 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>결론</h3>\n<p>힘들었던 점은, 나는 클라이언트-로드밸런서 / 혹은 로드밸런서-서버 둘 중 하나만 해결하면 문제가 해결될 줄 알았는데, 그렇지는 않았다는 점이다.</p>\n<p>마지막에 지푸라기라도 잡는 심정으로, 클라, 서버 둘 다 처리한 걸 테스트해보니까 문제가 해결됐다.\n어쩌면 ELB 관련 설정을 잘 해주면 단번에 해결될 문제였을지도 모르겠다. ELB 관련 공부가 더 필요하다.</p>\n<p>테스트 환경과 라이브 환경이 다른 것도 이번 삽질의 원인이었던 거 같으니, 연습을 실전처럼 하자고 건의해야겠다.\n버그 해결에는 다양한 시도와 창의적인 생각이 필수적인듯!</p>","fields":{"slug":"/posts/fix-elb-error","tagSlugs":["/tag/network/","/tag/backend/","/tag/load-balancing/"]},"frontmatter":{"date":"2020-01-20T22:40:32.169Z","description":null,"tags":["network","backend","load balancing"],"title":"ELB 로드밸런서 관련 오류를 해결하면서...","socialImage":"/media/42-line-bible.jpg"}}},"pageContext":{"slug":"/posts/fix-elb-error"}}}