동기 vs 비동기
동기 = 요청이 순차적으로 실행되며, cpu가 주어진 요청을 완료하기 전까지는 다음 요청을 처리하지 않는 방식
비동기 = 작업이 시작된 후 그 결과를 기다리지 않고 다른 작업을 계속 진행할 수 있는 처리 방식
Tomcat 서버에서는 동기, 비동기적 방식 모두 스레드 풀에 여러 스레드가 대기하고 있고, 여러 요청이 한 번에 오면 각 요청에 대해 스레드가 할당되어 처리된다.
동기에서의 작업 처리
동기에서 작업 요청이 오면, 각 스레드는 주어진 작업을 모두 스스로 처리한다.
위 그림에서 작업2가 외부 API를 호출하고 응답받을 때까지의 지연시간이라고 한다면,
작업 2만큼 스레드는 놀게 된다.
비동기에서의 작업 처리
작업 2를 비동기 처리해 두었다면, 스레드1, 2는 각각 작업1, 작업3을 마치고 다른 일을 하게 됩니다. 이와 병렬적으로 작업2는 다른 스레드가 해결한다.
이로 인해 스레드를 더욱 효율적으로 사용할 수 있다.
동기일 경우 Spring에서 발생할 수 있는 이슈
- 응답 지연 (Response Latency): 스레드를 모두 사용 중일 때 요청들이 계산하는 데 시간이 걸릴 경우, 나머지 요청은 모두 해당 작업이 끝날 때까지 대기하게 됩니다. 이로 인해 응답 지연이 발생할 수 있습니다.
- DB Connection Pool 문제: 동기적으로 요청을 처리하면, 동시에 많은 요청이 들어올 경우 DB 커넥션 풀이 부족해질 수 있습니다. 모든 요청이 DB와 연결되기를 기다려야 하기 때문에, 연결할 수 있는 커넥션의 수가 초과되면 connection timeout과 같은 오류가 발생할 수 있습니다.
참고
- 기본적으로 HikariCP는 최대 10개의 커넥션을 유지합니다.
- 커넥션 최대 대기 시간 기본값은 30초입니다. 커넥션을 요청할 때 커넥션 풀에 사용 가능한 커넥션이 없을 경우, 지정된 시간(기본 30초) 동안 대기합니다. 그 시간이 지나면 SQLException이 발생합니다.
비동기 방식을 통한 성능 해결
- 응답 속도 향상: 비동기 방식을 사용하면, 요청들에 대해 시간이 걸리는 작업은 비동기적으로 처리하기 때문에, 해당 작업이 끝나는 것을 대기하지 않는다. 이로 인해 응답 속도가 향상된다.
- DB ConnectionPool 문제 해결: 비동기 방식을 사용하면, 요청 → 응답 시간이 짧아지기 때문에 각 스레드가 DB Connection을 물고 있는 시간이 단축된다. 따라서 Connection timeout 문제가 발생할 확률이 줄어든다.
'Spring' 카테고리의 다른 글
Spring에서의 프로세스와 스레드 (0) | 2024.10.21 |
---|---|
Spring에서 @Async를 통한 비동기 처리하기 (0) | 2024.09.26 |
java PageImpl에서 totalElements가 바뀌는 오류 해결 (0) | 2024.08.13 |
[개발 일상] Spring 공통 응답 만들기 (0) | 2024.08.13 |
Spring 자바, 스프링에서 객체 응답시 is로 시작하는 변수가 변경되는 문제 (0) | 2024.05.25 |