keep-alive 설정을 추가하여 배포한 과정에서 나타난 connection 개수가 실시간으로 줄어들고 있다.
보면서 참 마음이 편-안 해졌다.
외부 통신을 위해 (Spring6의 RestClient와 함께) Apache HttpClient5 를 사용했는데,
내부에 있는 PoolingHttpConnectionManager 를 잘 활용하지 못하고 있어서 keep-alive가 안먹히는 현상이 있었다.
그래서 connection 개수가 요청이 들어올때마다 만들어지고, 결국엔 k8s의 egress가 제공하는 connection pool 제한을 넘어버리면서 요청이 실패하는 현상이 일어났다.
현상이 발생했던 이유는
HttpClient 내의 또다른 설정인 RequestConfig 라는 객체를 항상 새로 만들어줘야 해서 그에 따라 PoolingHttpConnectionManager도 새 객체로 만들어지고 있었고,
매 요청마다 PoolingHttpConnectionManager 객체가 새로 만들어지다 보니, 원래 있던 connection을 재활용하지 못하는 문제가 발생, k8s의 Egress 마저 부족해지는 현상이 발생하여 요청이 빈번하게 실패하는 현상이 있었음
트러블 슈팅, apache httpclient를 딥다이브하여 원인을 파악하고,
PoilingHttpConnectionManager을 HttpClient마다 모두 공유하도록 수정하여 배포하니 오류가 해결되었다.
느낀점
네트워크 쪽 이슈고, k8s의 Egress gateway와 같이 사용해서 그런가 원인이 오류 로그 내용과 크게 일치하지 않아서 디버깅이 정말 어려웠다.
네트워크 공부가 정말 필요하다고 느꼈고, 앞으로 새로운 기술을 도입할 때에도 딥다이브, 팀원들과 더블체크가 꼭 필요하다는 점을 느꼈다.
다음부터는 새로운 기술 도입을 할 때 기술 공유 세션을 열도록 해야겠다..