MSA

DB Connection 이 부족한 경우

방금시작한사람 2021. 9. 12. 03:16

만약 connection pool 에서 모든 커넥션을 쓰고 있다면 어떻게 될까?

 

서버가 터진당 ;; 🥶 

 

요청이 오면 톰캣 쓰레드에서 쓰레드를 할당 받고, 처리하는데

 

디비에서 데이터를 꺼내는데 오래걸릴경우(인덱스를 안타거나, 원래는 캐시에 저장되어야했으나 등등..)

쓰레드들이 db 커넥션을 할당 받기 위해 기다리는데

그럼 점점 요청들이 쌓이기 시작한다.. 공급(쓰레드풀)이 수요(요청)를 못따라감..

 

msa 구조라고 할때, 요청한 서버에서 할 수 있는건 타임아웃으로 걸거나 서킷을 걸어놓는 것이다.

 

그럼 터진 서버에서 해야할껀..?

빵 터졋을때 대응할 수 있는건... 서버를 늘리면 된다! 요청을 분산시키는 것이다.. 

쿠버네티스를 쓴다면 팟을 늘리면되겟다.. 허헣..

 

그다음엔 어플리케이션에서 대응해야할껀..

db connection time out 를 짧게 잡는거? 근데 이게 맞는지 잘 모르겟따 

인덱스를 잘타나 확인.. 캐시 웜업을 잘 해놓기.. 등등..


개인적으로 캐시에 의존해도 되는지는 잘 모르겟다

 

유저의 정보를 알아내는 서버가 있다고 하자 (유저 서버)

그리고 유저 정보는 여러 서버에서 요청을 처리할 때 필요한 정보라서, 모두가 유저 정보를 달라고한다.

 

그래서 유저서버는 유저 정보를 db 에서 읽어서 보내주는데
사실 유저 정보라는건 쉽게 변하지않아 매번 db 에서 읽을 필요가 없으니, 캐시를 달면 아주 좋다고 생각한다.

 

사업이 잘 되서, 유저가 증가하고 트래픽이 많아짐에 따라 더 많은 서버에서 유저 정보를 달라고한당
물론 문제 없이 캐시가 있으니까 바로바로 응답한다

 

그런데 갑자기 레디스 서버에 장애가 생겻다면?..!?

 

그럼 모든 트래픽은 다 유저 db 에 몰리게 되고, 위와 같은 상황이 생기지 않을까?

(심지어 이건 유저서버라서 모든 서버가 진짜 fall back 처리만 하고 실제 로직을 못돌지않을까.. 결국 모든 서비스 서버가 죽은셈치는..)

 

그럼 어떻게 해결해야될까?..

 

잘 모르겠따 😅

 

처음 요청받는 게이트웨이에서 유저에 대한 정보를 받아서 헤더에 넣고
요청을 처리하는 서버는 헤더 있는 정보를 사용하는 것? 

- 네트워크 처리 용량에 대해선 잘 모르겠다. 현재는 유저 ID(pk) 값을 넣어주고있다면

  이제는 모든 정보를 다 들고 있으니 트래픽 용량이 커지지않을까? 라는 생각.. (잘모름)

 

캐시가 터질지 모르니, db 복제를 해놔서 db 가 받는 부하를 분산시킨다?

- 언제 터질지 모르는 것을 대비해서 인프라를 쑤욱쑤욱 늘리는게 맞나? 더 효율적인 방법은 없나 .. 

- 캐시가 없을때를 대비해서 얼마나 복제해놔야 하는지 정량화를 할 수 있을까?