Stateful : 상태유지 서버가 클라이언트의 이전 상태를 보존 진행해오던 작업의 맥락 정보를 보낼 필요가 없어 클라이언트의 데이터 전송량이 줄어든다. 따라서 항상 같은 서버가 유지되어야 한다.
단점: 서버1이 장애가 나면 처음부터 다시 진행해야한다.
Stateless: 상태 유지 x 상태를 유지하지 않으므로 서버가 바뀌어도 된다 그래서 갑자기 클라이언트 요청이 증가하면 서버를 대거 투입할 수 있다.
아무 서버나 호출해도 된다. 필요한 정보, 맥락을 클라이언트가 전부 보내기 때문이다. 단점은 데이터를 너무 많이 보내야 한다는 것. 클라이언트는 맥락 정보를 다 보낸다. 중간에 서버1이 장애가 나면 다른 서버가 응답하면 된다.무상태는 응답 서버를 쉽게 바꿀 수 있다 → 무한한 서버 증설 가능
매번 TCP/IP 연결을 새로 맺어야한다.. 이때 3 way handshake 시간이추가된다..
또한웹브라우저로요청할때, HTML 하나만이아니라 js, css 파일, 이미지등수많은자원이함께 다운로드 된다..
(HTML을 렌더링 하려고 봤더니 JS가 필요하네? 이미지가 필요하네?)
HTTP 초기 버전에서는 아래와 같이 매번 연결/종료 과정을 거쳤다.
HTTP 초기 - 연결/종료 낭비
지금은 HTTP 지속 연결(persistent connections)로 문제를해결
연결/종료 낭비를 획기적으로 줄여버렸다
HTTP 2,3은는 더빠르게 동작한다. 특히 3는 UDP를쓰면서연결속도를 확 줄여버렸다.
서버개발자들이어려워하는업무
이벤트등으로같은시간에딱 맞춰어 발생하는대용량트래픽 →수만 명이 '동시에'요청
그럼비연결성이고나발이고소용이없다. 진짜동시요청이많아지므로..
이럴 땐 Stateless를기억하자. 서버를 증설하는 수밖에 없다.
최대한 stateless하게 설계하는게중요하다.
그래야서버를확증설할수있다.
HTTP 메시지
HTTTP 메시지의구조: 시작 라인 - 헤더 - 바디
1. 시작라인
요청과 응답에 대한 개요
start-line = request-line (요청) / status-line (응답)
요청메시지 : method,request-target, HTTP-version ex) GET /search?q=hello&hl=ko HTTP/1.1 - method: 서버가 수행해야 할 동작 지정 (GET, POST, PUT, DELETE…) - request-target: 절대 경로[? 쿼리] ※절대경로 : /로 시작하는 경로
응답메시지 : HTTP-version, status-code, reason-phrase ex) HTTP/1.1 200 OK - status-code: 요청 성공, 실패를 나타냄 - reason-phrase: 사람이 이해할 수 있는 짧은 상태 코드 설명 글