2023-08-08-TIL
2023-08-08-TIL
Today I Learned
HLS(.ts) File
HLS(HTTP Live Streaming)는 영상을 짧은 세그먼트 파일로 잘라 일반 HTTP로 내려주는 스트리밍 방식이다. 플레이어는 .m3u8 재생 목록(playlist)을 받아 세그먼트 URL 목록을 읽고, 세그먼트를 차례로 받아 재생한다. 이때 세그먼트 파일의 확장자가 .ts다.
.ts는 MPEG-2 Transport Stream 형식이다. HLS 명세인 RFC 8216은 세그먼트 형식으로 MPEG-2 TS와 fragmented MPEG-4(fMP4) 등을 정의한다. TS 세그먼트는 MPEG-2 프로그램 하나만 담아야 하고, 각 세그먼트에 PAT(Program Association Table)와 PMT(Program Map Table)가 있어야 한다. 덕분에 세그먼트 하나만 받아도 그 안의 영상·음성 스트림을 해석할 수 있다. TS는 원래 방송 전송용으로 만들어진 형식이라 일부가 손실돼도 이어서 재생할 수 있게 작은 고정 크기 패킷 단위로 구성된다.
- https://stackoverflow.com/questions/38347179/hls-segment-ts-internal-format
- https://www.movavi.com/kr/learning-portal/ts-file.html
- https://ko.eyewated.com/ts-%ED%8C%8C%EC%9D%BC%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C/
HTTP Request Compressing and Content-Encoding
MDN은 Content-Encoding을 본문에 적용된 인코딩과 그 적용 순서를 알려 주는 헤더로 설명한다. 받는 쪽은 이 값을 보고 원래 미디어 타입(Content-Type)의 데이터로 되돌린다. 값으로는 gzip, deflate, br(Brotli), zstd 등이 있다.
보통의 흐름은 응답 압축이다.
- 클라이언트가
Accept-Encoding: gzip, br로 해석할 수 있는 방식을 알린다. - 서버가 그중 하나로 응답 본문을 압축하고
Content-Encoding: gzip을 붙인다. - 클라이언트가 본문을 풀어 사용한다.
MDN은 클라이언트가 요청한 압축을 서버가 실제로 쓸지는 서버 설정과 능력에 달려 있다고 덧붙인다. 요청 본문을 압축해서 보낼 때도 같은 Content-Encoding 헤더를 쓴다. 다만 요청 쪽은 협상 절차가 없으므로 서버(또는 API 게이트웨이)가 그 인코딩을 풀 수 있게 설정되어 있어야 한다. 이미 압축된 이미지나 영상은 다시 압축해도 크기가 거의 줄지 않으니, 텍스트 계열(JSON, HTML, CSS)에만 압축을 거는 것이 일반적이다.
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding
- https://documentation.softwareag.com/webmethods/compendiums/v10-11/C_API_Management/index.html#page/api-mgmt-comp/to-http_compression_3.html
- https://velog.io/@ss-won/FE-%EB%B2%88%EC%97%AD-Gzip-%EC%95%95%EC%B6%95%EC%9C%BC%EB%A1%9C-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EC%B5%9C%EC%A0%81%ED%99%94%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95
- https://www.holisticseo.digital/technical-seo/web-accessibility/http-header/content-encoding
- https://en.wikipedia.org/wiki/HTTP_compression
Connection Timeout vs Socket Timeout
두 타임아웃은 기다리는 대상이 다르다.
- Connection timeout: TCP 연결을 맺는 데 기다리는 최대 시간이다. 서버가 꺼져 있거나 방화벽이 패킷을 버리면 여기서 걸린다. Java에서는
socket.connect(address, timeout)로 정하고, 초과하면SocketTimeoutException: Connect timed out이 난다. - Socket(read) timeout: 연결된 뒤 데이터를 읽을 때 다음 데이터가 올 때까지 기다리는 최대 시간이다.
socket.setSoTimeout(timeout)으로 정하고, 초과하면SocketTimeoutException: Read timed out이 난다.
Baeldung 글에 따르면 두 값 모두 밀리초 단위이고, setSoTimeout(0)이면 데이터가 올 때까지 무한정 기다린다. read timeout은 응답 전체에 대한 제한이 아니라 패킷 사이 간격에 대한 제한이라는 점도 헷갈리기 쉽다. 데이터가 조금씩 계속 오면 전체 응답이 아무리 오래 걸려도 타임아웃이 나지 않는다. 외부 API를 호출하는 HTTP 클라이언트에는 두 값을 모두 명시해 두는 것이 안전하다.
- https://www.baeldung.com/java-socket-connection-read-timeout
- https://medium.com/javarevisited/what-is-the-difference-between-connecttimeout-and-sockettimeout-c2e9a0c89c60
Transaction Isolation Level
격리 수준이 낮을수록 동시성이 높아지는 대신 아래 현상이 허용된다.
| 격리 수준 | Dirty read | Non-repeatable read | Phantom read |
|---|---|---|---|
| READ UNCOMMITTED | 발생 | 발생 | 발생 |
| READ COMMITTED | 없음 | 발생 | 발생 |
| REPEATABLE READ | 없음 | 없음 | 발생 |
| SERIALIZABLE | 없음 | 없음 | 없음 |
표는 SQL 표준의 정의다. 실제 동작은 DB마다 다르다. MySQL InnoDB의 REPEATABLE READ는 일관된 읽기에서 첫 조회 때 만든 스냅샷을 계속 읽고, 잠금 읽기에는 next-key 잠금을 걸어 범위 삽입을 막는다(MySQL 문서).
- https://dar0m.tistory.com/225
- https://nesoy.github.io/articles/2019-05/Database-Transaction-isolation
- https://labs.brandi.co.kr//2019/06/19/hansj.html
댓글
아직 댓글이 없습니다