HTTP가 영상을 스트리밍하는 방법?
하나의 파일은 해상도마다 짧은 재생 시간(초 단위)을 가지는 여러 개의 동영상 파일로 구성되어 있다.
HTTP GET 요청이 오면 서버에서 특정 시점부터 몇 초 단위의 영상들을 여러 개 response로 보내는 방식으로 동영상을 재생할 수 있도록 한다.
만약 응답 속도가 네트워크 속도 등에 의해 지연되면, 낮은 해상도의 영상들을 전송한다.(반대로 네트워크 상황이 좋을 경우에는 높은 해상도의 영상들을 전송한다)
Monolithic vs SOA vs Microservice
Monolithic
한 대의 컴퓨터 내에서 하나의 실행 프로그램 내의 함수, 클래스 등이 정보를 주고 받는 구조
SOA (Service Oriented Architecture)
서버들이 기능별로 분화된 구조. 클래스, 함수 레벨에서 통신을 통해 정보를 주고 받을 수 있도록 여러 컴퓨터에 기능 별로 나눈 구조 (서비스 지향적)
Microservice
서비스에 맞춰서 서버들을 분할하여 서버 간의 통신을 통해 정보를 주고 받는 구조
(Serverless ; 서비스 단위(함수 단위)로 돌아가기 때문에 서버가 없다고 보는 것, Cloud Native)
- OpenStack : Virtual machine 기반. Host OS위에 가상머신을 띄워 그 위에 Guest OS를 설치하고 프로그램을 돌리는 방식. (Host OS와 Guest OS가 같은 상황 발생 => 성능 저하)
- Docker(Container) : Container 기반
- < Host OS가 Linux인 경우 >
Host Linux 위에 Docker 엔진을 실행시킨 다음 그 위에서 필요한 만큼의 자원을 할당하고 프로그램을 실행하도록 하는 방식
- < Host OS가 Linux가 아닌 경우 >
Host OS위에 가상화를 위한 엔진인 Hypervisor(호스트 컴퓨터에서 여러 운영체제를 실행시키기 위한 플랫폼. VMM; Virtual Machine Monitor/Virtual Machine Manager)를 실행시킨 후 그 위에 Guest Linux를 올려 그 위에 Docker 엔진을 실행시키는 방식.
- Kubernetes(Orchestrator) : Docker 위에 여러 개의 프로그램들을 실행시키기 위해 자동으로 자원을 할당하고 프로그램을 실행하도록 해 주는 웹 응용프로그램.
SOAP vs REST
-
SOAP (Simple Object Access Protocol) : HTML과 같은 방식의 태그 기반의 문서 형태(xml)로 정보를 전달하는 방식.
-
REST (Representational State Transfer) & RESTful : 컴퓨터가 잘 이해할 수 있는 형태의 데이터(JSON)를 HTTP 위에서 실어서 컴퓨터 간의 정보를 주고 받을 수 있도록 하는 방식
JSON (JavaScript Object Notation)
- 자바스크립트 언어의 데이터 표현 방식
- 웹 브라우저는 자바스크립트 번역기를 내장하고 있기 때문에 웹 서비스에 유리하다.
- 확장자 .json을 사용하며, 별도의 파일로 저장하여 파일의 형태로 보낼 수 있다. (문자열로도 전송 가능)
- 무상태(전후 관계가 없음을 의미. 이전의 요청과 현재의 요청은 관계가 없으며 독립적), 실시간 서버 대 브라우저 통신 프로토콜(HTTP 기반의 서버)로 많이 활용된다.
- 기본적인 프로그래밍 언어의 데이터 형태를 지원한다.
- 정수, 실수 (고정/부동 소수점), 문자열
- 배열 : [a, b, c]
- 객체 : {“member1” : “value1”, “member2” : “value2”}
- 순수한 ‘데이터 포맷’으로 메서드를 표현할 수 없다.
- 문자열과 프로퍼티의 이름 작성시 큰 따옴표만을 사용해야 한다.
REST & RESTful
REST 구조에 대한 제한 조건
- 인터페이스 일관성 : 일관적인 인터페이스로 분리되어야 한다. 미리 정의한 인터페이스(api) 호출 방식을 지켜야 한다.
- 무상태(Stateless) : 각 요청 간 클라이언트의 Context는 서버에 저장하지 않는다. 이전의 요청과 현재의 요청은 무관하다.
- 캐시 처리 가능(Cacheable) : 클라이언트는 응답을 캐싱할 수 있어야 한다.
- 계층화 (Layered System) : 클라이언트는 보통 대상 서버에 직접 연결되었는지, 또는 중간 서버를 통해 연결되었는지를 알 수 없다. 중간 서버는 로드 밸런싱 기능이나 공유 캐시 기능을 제공함으로써 시스템 규모 확장성을 향상시키는 데 유용하다. 클라이언트 입장에서 서버가 여러 개 존재하더라도 REST가 잘 동작할 수 있어야 한다.
- Code on demand (optional) : 자바 애플릿(웹 브라우저 환경에서 실행되는 특정한 작업을 수행하는 작은 프로그램)이나 자바스크립트의 제공을 통해 서버가 클라이언트가 실행시킬 수 있는 로직을 전송하여 기능을 확장 시킬 수 있다. 서버가 응답을 처리하는 코드를 클라이언트에게 제공하는 것을 의미한다.
- 클라이언트/서버 구조 : 아키텍처를 단순화시키고 작은 단위로 분리 (decouple)함으로써 클라이언트-서버의 각 파트가 독립적으로 개선될 수 있도록 한다. 클라이언트는 서버의 자세한 사항을 신경쓰지 않고 제공되는 인터페이스를 통해 접근하여 응답을 받고 자신의 Context를 관리한다. 서버는 클라이언트의 상태를 신경쓰지 않고 제공한 인터페이스에 대한 처리만 담당하여 요청이 들어올 때 그에 맞는 응답을 제공한다.
REST와 RESTful
- REST는 HTTP Request/Response 메시지를 통한 Client/Server 간 정보 송수신을 의미한다.
RESTful한 api
- 예를 들어 http://localhost/ 서버를 개발한다면
- GET : Read로 간주하며, {문자열}을 key 값으로 하여 클라이언트가 요구하는 데이터를 찾아 해당 데이터(value)를 리턴한다.
- PUT : Create로 간주하며, {문자열}을 key 값으로 하여 HTTP Request의 Body에 해당하는 값을 value로 하는 record를 생성한다.(저장한다)
- 통상 CRUD(Create, Read, Update, Delete)를 따른다.
![](https://velog.velcdn.com/images/eunna/post/199b9cb7-e2ec-476a-bdfb-1e98cb31fb9a/image.png)