BackEnd/이슈 정리

로깅 로직 수정

하용권 2024. 12. 15. 21:06

1. 문제 상황

트래픽이 몰리는 시간 대에 response time이 지연되는 현상이 있었습니다. 로깅 툴을 보니 jdbc 커넥션을 맺거나 db에 insert하는 데에 많은 시간이 걸리고 있었습니다.

 

2. 원인

제가 맡은 서비스는 아니였지만, 최근에 도메인을 넓히면서 해당 서비스도 보고 있었습니다.

 

이 서비스는 사용자 요청이 오면 이를 처리한 후 DB에 로그 데이터를 넣는 방식으로 동작하고 있었습니다.

 

DB의 insert 작업은 조회에 비쌉니다.(다행히도 index는 걸려있지 않았었습니다. 해당 로그를 조회할 일이 크게 없어서 그런가봅니다...)

그렇다보니 부하가 발생하면 해당 작업을 처리하기까지 connection pool을 차지하고 있을 것이고 다른 요청들은 남는 connection pool이 없어서 대기를 하고 있는 현상이 발생합니다.

 

3. 해결

 

로깅 적재 로직을 변경했습니다.

 

요청 - Redis Stream - 주기적으로 stream 에 있는 데이터를 꺼내서 DB에 넣도록 수정했습니다.

 

redis stream의 경우에는 인 메모리를 이용하고 있기 때문에 적재할 수 있는 데이터의 사이즈를 고정시켜두었습니다. 만약 해당 사이즈를 넘으면 오래된 데이터는 제거하도록 했습니다.

 

그리고 주기적으로 stream에 있는 데이터를 batch size 만큼 한 번에 가져오고, 일정 개수 이상 모이게 되면 DB에 데이터를 적재하도록 했습니다.

 

 

이렇게 로직을 수정한 결과 엄청난 성능 향상이 있었습니다.

 

TPS는 기존 1219 -> 5492 까지 증가했습니다.

response time의 경우에는 486ms -> 104ms(median) 까지 감소했습니다.

중앙값 뿐만이 아니라 p99도 609ms -> 189ms 까지 감소했습니다.

 

반응형