참고: 가상 면접 사례로 배우는 대규모 시스템 설계 기초, 알렉스 쉬
무상태 웹 계층
무상태 웹 계층은 클라이언트(사용자)에 대한 상태 정보를 웹 계층에 두지 않는 것을 말한다. 만약, 저장해야 한다면, 데이터베이스와 같은 지속 저장소(RDB, Cache, NoSQL 등)에 보관한다. 이 저장소에 클라이언트 상태 정보를 관리하며 각 서버들이 함께 사용한다.
특징
- 상태 정보 부재 : 웹 서버가 클라이언트의 상태 정보(세션 상태 및 정보 등)를 모르기 떄문에, 각 클라이언트의 요청은 독립적으로 처리된다. 따라서, 클라이언트는 기본적으로 요청과 함께 필요한 모든 정보를 보내야 한다.
- 확장성 증대 : 각 서버들은 클라이언트의 상태를 저장하지 않기 때문에 각 서버들의 일관성을 유지할 수 있고, 서버 간 요청을 분배하기 수월하고 확장성 또한 높아진다.
장점
- 고가용성, 탄력성 : 각 서버들 간 일관성이 있으므로, 특정 서버가 다운되더라도 그 외 서버에서 즉각적으로 처리할 수 있다.
- 로드 밸런싱 : 서버 간 일관성이 있어, 서버 간 요청 분배를 쉽게 할 수 있다. 그에 따라 네트워크 트래픽, 서버 부하를 효과적으로 관리할 수 있다.
단점
- 효율성 저하(네트워크 비용 약간 증가) : 서버는 사용자의 상태를 저장하지 않으므로 각 요청에는 사용자 정보가 함께 전송되야 한다. 따라서, 각 요청의 부가 데이터들의 네트워크 비용도 발생하게 된다.
- 클라이언트의 복장성 증가 : 상태 관리를 서버 대신 클라이언트에서 처리해주어야 하므로, 클라이언트의 로직이 복잡해 질 수 있다.
상태 정보 의존 웹 계층
위 무상태 웹 계층과 반대로 상태 정보에 의존적인 웹 계층도 존재한다. 상태 정보 의존 웹 계층에 여러 서버가 존재할 경우, 각 사용자들은 자신의 정보를 저장하고 있는 특정 서버로만 요청을 보내야 한다. 예를 들어, A 클라이언트가 A 서버에 상태 정보를 보내 저장하고, B 클라이언트는 B 서버에 저장할 경우, 그 이후 요청들 또한 A클라이언트는 자신의 정보를 저장하고 있는 A 서버에, B 클라이언트는 B서버에 요청을 해야한다. 그렇지 않고 A클라이언트가 자신의 정보가 없는 B서버에 요청할 경우, 인증 실패 등의 상황이 발생할 수 있다.
로드밸런서의 고정 세션 기능
위 처럼, 클라이언트와 해당 클라이언트의 상태 정보를 저장하고 있는 서버를 1대1 매칭해 요청과 응답을 주고받게 해야 한다. 이를 가능케 하기 위한 기능이 로드밸런서의 고정 세션(sticky session) 기능이다.
단점
- 로드밸런서의 부하가 증가한다는 점이 있다.
이전 설계도에서 무상태 웹 계층으로 변경