며칠동안 골치를 썩히던 문제를 해결하면서 알아낸 것 들을 조금 추가해서 정리합니다.
문제 : 스프링, Webflux 를 사용하며 MongoDB, 그리고 Tailable을 통해서 무한 스트림 지원중 connectionPool이 100개를 넘어가고
connection pool이 연결이 끊기지 않아 계속 누적되는 현상 발생
(사실 이것도 계속 찾아내가면서 알아낸거지 처음 원인을 찾을때 잘못짚어서 한참을 고생했다...ㅠ)
제가 유튜브 영상강의를 접했을 때는 해당 어노테이션을 통해 Tailable를
유지해
무한스트림을 할 수 있었지만
이 어노테이션 말고 ReactiveMongoTemplate를 통해서
쿼리문과 document 설정으로
DB에 접근하는 방법도 있습니다.
이렇게 DB와 Tail을
통해서 연결이 된다면 Connection이 열리며 저 값들이 올라가는데
몽고 디비는 connection pool 이라는게 있습니다. 보통의 연결들은 자동으로 연결되고 죽는 걸 반복하지만
Tailable은 무한 스트림이라서 계속 connection이 유지됩니다.
(사실 처음에는 커넥션이 죽으면 저기 localValue 값도 낮아지는 줄알았으나… 죽고 다시만들어도 네임은
계속 누적된다. 15..16..17 이런식으로)
기본 default값은 100이고
100을 넘기면 아예 몽고 클라이언트가 끊겨서 작동하지 않는 불상사가 일어납니다.
위와 같은 문제를 해결하기 위해
이런 식으로 설정해줬는데
찾아보니 기본 유지 connection이 어느정도 있어야 새로운 연결없이
할수있다는 설명 이 있길래
최소 사이즈는 10, 최대 connection
pool 은 500개로 설정했으며
라이프 사이클 최대시간은 5초 유효시간이 5초이상 지났을 경우 connection 수명이 끝나는 시간도
5초로 설정했습니다.
타임아웃은 2초 입니다.
이렇게 설정해두면 라이프사이클이 돌면서 연결이 죽고 다시 태어남을 반복해
최대 500을 넘지 않아 몽고디비 커넥션풀이 잘 돌아가도록 만드는
세팅을 완성했습니다.
이제 실제 서비스를 하면서 성능 개선을위해 조금씩 바꿀 예정입니다.
무조건 커넥션 시간이 짧다고, pool이 넓다고 좋은게 아니기 때문입니다!
이상입니다.