공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.
Redis를 이용한 Session 관리
Session 관리란?
세션 관리는 사용자가 웹 사이트에 로그인한 이후의 모든 활동(검색, 장바구니 추가, 결제 등)이 서로 연결되어 일련의 연속된 행위로 인식되도록 하는 메커니즘이다. 이를 통해 상태가 없는 HTTP 프로토콜에서도 사용자의 상태를 지속시킬 수 있다.
Redis를 이용한 세션 관리의 장점
Redis를 세션 관리에 사용하면, 빠른 데이터 처리 속도와 함께 서버 재시작 시에도 데이터가 유실되지 않는 안정성을 보장받을 수 있다. 또한, 분산 시스템 환경에서 세션을 여러 서버에 걸쳐 일관성 있게 유지할 수 있다는 큰 장점이 있다.
동작 방식
- 세션 생성: 사용자가 웹 사이트에 최초 로그인 시, 서버는 유일한 sessionId를 생성한다. 이 sessionId는 사용자의 브라우저(클라이언트)에 쿠키 형태로 저장되며, 사용자가 서버에 요청할 때마다 이 sessionId를 함께 전송한다.
- 세션 인식 및 처리: 서버는 요청과 함께 전송된 sessionId를 이용해 Redis에서 해당 세션 정보를 조회한다. 사용자의 이전 행동 내역, 설정된 세션 속성 등을 빠르게 불러와 사용자의 요청을 개인화하여 처리한다.
- 세션 속성 관리: 세션에는 creationTime, lastAccessTime, expirationTime, attributes 등 여러 속성이 관리된다. 이러한 속성들은 사용자의 세션 활동에 따라 동적으로 갱신되며, 세션의 유효성을 체크하는 데 사용된다.
세션 데이터 예
세션 정보는 키-값 형태로 Redis에 저장되며, 주요 정보는 다음과 같다.
- Key: sessionId
- Value: {
- sessionID: "ABC123XYZ",
- creationTime: "2024-07-01T12:00:00Z",
- lastAccessTime: "2024-07-01T12:30:00Z",
- expirationTime: "2024-07-01T22:00:00Z",
- attributes: {"isLoggedIn": true, "userId": 12345} }
사용 예
사용자가 웹 사이트를 방문해 로그인하고 상품을 검색한 후, 장바구니에 상품을 추가하고 결제까지 진행하는 과정에서 모든 상태 정보가 세션을 통해 관리되고 연속성을 가지며 처리된다.
Redis를 이용한 세션 관리는 웹 애플리케이션의 성능을 크게 향상시킬 수 있으며, 사용자 경험을 개선하는 데 크게 기여한다. 이러한 접근 방식은 특히 동시 사용자 수가 많은 대규모 시스템에서 그 효과가 두드러진다.
과거와 현재 Session 관리방식
세션 관리는 사용자의 상태를 유지하고, 웹 애플리케이션의 연속성과 안정성을 보장하기 위한 필수적인 요소다. 시간이 흐르면서 세션 관리 방식은 크게 변화했다.
과거: 스티키 세션(Sticky Session)
- 개념: 사용자가 처음 연결된 서버에 계속해서 연결되도록 하는 방식이다. 사용자의 세션 정보는 처음 연결된 서버에만 저장되며, 모든 요청은 동일 서버로 라우팅 된다.
- 구현: Load balancer(로드 밸런서)를 사용해 트래픽을 관리한다. L4와 L7 로드 밸런서는 각각 네트워크 레이어와 애플리케이션 레이어에서 트래픽을 분산시킨다.
- 문제점: 세션 정보가 서버 간에 공유되지 않기 때문에, 특정 서버에 장애가 발생하면 해당 사용자의 세션 정보에 접근할 수 없게 된다. 이는 서비스의 연속성에 문제를 일으킬 수 있다.
현재: 세션 스토어 방식
- 개념: 모든 세션 정보를 중앙 집중식 데이터 저장소에 저장하여 관리하는 방식이다. 이를 통해 모든 서버가 세션 정보에 접근할 수 있으며, 사용자의 요청을 가용성이 높고 지연 시간이 낮은 서버로 자유롭게 라우팅 할 수 있다.
- 구현: Redis와 같은 인메모리 데이터 스토어를 사용하여, 세션 정보를 관리한다. Redis는 빠른 데이터 접근 속도와 TTL(Time-To-Live)을 지원하는 만료 정책으로, 세션 관리에 적합하다.
- 장점:
- 지리적 근접성: 사용자가 지리적으로 가까운 서버에 연결되도록 할 수 있다.
- 레이턴시 최적화: 지연 시간이 가장 적은 서버에 사용자를 연결할 수 있다.
- 로드 밸런싱: 라운드 로빈 방식 등 다양한 로드 밸런싱 방법을 통해 요청을 균등하게 분산시킬 수 있다.
이러한 방식은 확장성과 유연성을 크게 향상시키며, 사용자 경험을 개선하는 데 기여한다. 현재 많은 웹 서비스들이 세션 스토어 방식을 채택하고 있으며, Redis를 포함한 다양한 인메모리 데이터베이스가 이 분야에서 활발히 사용되고 있다.
Redis를 이용한 배송 서비스
오늘날 많은 온라인 판매자들은 여러 물류센터를 통해 상품을 배송한다. 이러한 상황에서 각 주문에 대해 최적의 물류센터를 선정하는 것은 로지스틱 비용을 줄이고 배송 시간을 단축하는 데 중요하다.
판매자로부터 구매자까지의 경로가 다양할 수 있는데, 어떤 물류센터를 경유하는 것이 최소 시간을 보장할 수 있는지 결정해야 한다.
이때 주요 고려사항은 다음과 같다.
- 거리 및 시간 최소화
- 비용 효율성
- 배송 신뢰성
Redis의 GEO 기능 활용
Redis의 GEO 기능을 이용하여 각 물류센터와 구매자의 위치에 대한 거리를 계산할 수 있다. 이 데이터를 활용해 초기 필터링을 수행하고, 가장 가까운 몇 개의 물류센터를 선정할 수 있다.
- 데이터 수집: 각 물류센터와 판매지점, 구매자의 위치 정보(경도, 위도)를 수집한다.
- Redis에 데이터 입력: 경도와 위도 정보를 Redis에 입력한다. 예를 들어, GEOADD 명령을 사용하여 물류센터의 위치를 저장한다.
- 거리 계산: GEORADIUS 또는 GEODIST 명령을 사용하여 특정 위치에서 가장 가까운 물류센터를 찾는다.
- 비용-효율적 결정: 가장 짧은 거리의 물류센터를 기반으로 추가 API 호출을 결정하거나, 내부 규칙에 따라 결정한다. 예를 들어, 거리 차이가 크지 않은 경우 더 비용이 적게 드는 센터를 선택할 수 있다.
- 이 명령은 출발지로부터 50km 이내에 있는 물류센터를 거리가 짧은 순으로 정렬하여 반환한다.
내부 규칙에 따라, 두 지점 간 거리 차이가 8km 이하인 경우에만 추가 API 호출을 실행한다. 이를 통해 비용을 절감할 수 있으며, 필요하지 않은 A-Hub는 이 과정에서 제외된다.
Redis의 GEO 기능을 활용한 물류센터 선택 최적화 접근법은 물류 및 배송 관련 비즈니스에서 비용 절감과 효율성 증대에 큰 기여를 한다. 이 방법을 통해 불필요한 API 호출을 줄이고, 실제 필요한 거리 계산에 대해서만 정밀하게 처리할 수 있다. 이러한 전략적 접근은 물류 경로를 최적화하고, 운영 비용을 줄이며, 전체적인 서비스 품질을 향상시키는데 도움이 된다.
'BackEnd > Project' 카테고리의 다른 글
[BigData] Ch10. Kafka의 기본 개념 (1) | 2024.09.16 |
---|---|
[BigData] Ch09. Kafka 활용 서비스 설계 (0) | 2024.09.16 |
[BigData] Ch07. Redis 장애 Case 및 대응 (4) | 2024.09.16 |
[BigData] Ch06. Redis 서비스 Test (0) | 2024.09.16 |
[BigData] Ch05. Redis 코드 작성 및 배포(5) (0) | 2024.09.16 |