사용자가 증가함에따라 하나의 서버로 사용자의 요청을 감당하기 어려워져 Spring Boot 서버를 여러개 사용할 때 각 서버들에게 요청을 분산하여 부하를 줄일 수 있다 (Load Balancing)
이런 방식의 확장을 Scale-Out이라고 부른다. (서버의 개수를 늘림)
(서버 자원의 크기 자체를 높이는 방식의 확장은 Scale-Up이라고 부른다.)
사용자가 A서버로 요청을 했다가, B 서버로 요청을 하게 된다면 세션은 어떻게 유지 될까?
(세션 : 상태를 저장하지 않는 HTTP 통신을 사용하면서, 이전에 요청을 보낸 사용자를 기억하는 상태를 유지하는 것)
여러 서버를 가동하게 되면, 세션의 정보를 서버 내부에서 관리하기 어려워지는데.. 이에 따른 대안을 알아보자.
Sticky Session
특정 사람이 보낸 요청을 하나의 서버로 고정하는 방법을 Sticky Session이라고 한다.
요청을 분산하는 로드 밸런서를 통해 요청을 보낸 사용자를 기록하고 해당 사용자가 재요청을 할 경우 최초로 요청이 전달되 서버로 요청을 전달하는 방식이다.
문제점) 특정서버로 요청을 전달하는 사용자들만 활발하게 활동한다면.. 요청이 균등하게 분산되지 않고 이는 과부하로 이어질 수 있다.
Session Clustering
여러 서버들이 하나의 저장소를 공유하고, 해당 저장소에 세션에 대한 정보를 저장하여 요청이 어느 서버로 전달이 되든 세션 정보가 유지 될수 있도록 하는 방법을 Session Clustering이라고 한다.
사용자가 서버의 로드밸런서로 요청을 보낼 때 세션을 생성하되,
이 세션에 연결된 정보를 내부에 저장하는 게 아닌 외부의 저장소에 저장을 한다.
이 사용자가 재요청을 해도 세션 정보는 외부 저장소에 있기때문에 어느 서버로 요청을 보내도 확인이 가능하다.
외부 저장소를 사용하기때문에 사용자의 요청을 처리하는 서버를 자유롭게 추가 및 제거가 가능해져
사용자의 증감소에 따라 유연하게 대처할 수 있다.
문제점) 서버 외부에 세션을 저장해서 관리 포인트가 늘어나고, 통신과정에서 지연이 발생한다.
👉 지연이 적은 Redis와 같은 인메모리 데이터베이스가 많이 사용된다.
Spring Boot에서 Session Clustering 적용하기
build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.session:spring-session-data-redis' // 추가!
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
spring-session-data-redis를 추가하면, 내장 Tomcat의 세션 기능을 사용하지 않고 Redis에 별도로 세션을 저장하게 된다.
application.yml
spring:
data:
redis:
host: localhost
port: 6379
username: default
password: systempass
더이상 Tomcat을 사용하지 않기 때문에 JSESSIONID 대신 SESSION이라는 새로운 쿠키를 사용함
(JSESSIONID라고 하는 쿠키값은, 서버 내부의 Tomcat이 처음 접근한 브라우저에게 발급하는 쿠키, 이 값을 바탕으로 세션을 관리하고, HttpSession 객체로 만들어 줌)
'TIL' 카테고리의 다른 글
[TIL] 장애대응 (0) | 2024.08.20 |
---|---|
[TIL] DB Lock | 비관적 락 (Pessimistic Locking) | 낙관적 락 (Optimistic Locking) (0) | 2024.08.20 |
[TIL] 모니터링 (0) | 2024.08.16 |
[TIL] SAGA Pattern (0) | 2024.08.16 |
[TIL] Kafka란? (0) | 2024.08.15 |