-
분산 환경에서의 session 스토어대용량 데이터 & 트래픽/대용량 처리를 위한 redis 2024. 3. 10. 20:27
세션을 이용해서 로그인을 진행한다고 할 때, 로드 밸런싱을 사용하려면 세션 동기화를 만들어줘야 한다. 만약에 그렇지 않으면 8080포트에서 로그인 한 사용자가 8081 포트로 요청을 보낼 때 사용자의 정보가 없을 것이다.
Redis를 사용하면 세션 클러스터링을 할 수 있다.
build.gradle
dependencies { implementation 'org.springframework.session:spring-session-data-redis' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-redis' testImplementation 'org.springframework.boot:spring-boot-starter-test' }
springframework의 session에 redis를 이용한다는 의존성을 주입해준다.
application.yml
spring: session: storage-type: redis data: redis: host: localhost port: 6379
application.yml에도 spring-session-storage-type을 redis로 지정해준다.
LoginController
@RestController public class LoginController { @GetMapping("/login") public String login(HttpSession session, @RequestParam String name) { session.setAttribute("name", name); return "saved."; } @GetMapping("/myName") public String myName(HttpSession session) { String myName = (String)session.getAttribute("name"); return myName; } }
이후에 간단한 컨트롤러를 만들어서 redis를 적용해서 session에 set을 하는 기능과 get을 하는 기능을 만들었다.
그 다음에 bash 2개를 켜놓고 8081포트와 8082포트로 명령어를 통해 실행시켰다.
먼저 8081번 포트로 들어간 다음에 session을 확인해봤는데 NmZiYm...이라는 세션이 헤더에 저장되어 있었다.
이후에 8082번 포트에서 name을 호출하는 요청을 했는데, 여기의 헤더에도 같은 sessionId가 저장된 것을 확인할 수 있었다.
세션은 인스턴스가 다르면 공유를 하기 위해 별도로 설정을 해주거나 해야하는데, 이런 방식은 쉽지 않고 리소스도 많이 든다. redis의 세션 클러스터링을 이용하면 방금 했던 것처럼 쉽게 사용할 수 있으니 분산 환경에서 잘 적용해서 사용하면 좋을 것 같다.
'대용량 데이터 & 트래픽 > 대용량 처리를 위한 redis' 카테고리의 다른 글
Redis의 Pub/Sub을 이용한 채팅방 기능 구현 (0) 2024.03.11 redis의 Sorted Sets을 활용한 리더보드 구현 (0) 2024.03.11 서비스 속도를 높이는 redis의 캐시레이어 (0) 2024.03.10 Redis의 data type (0) 2024.03.10 In-memory DB인 Redis의 특징 (0) 2024.03.10