-
Notifications
You must be signed in to change notification settings - Fork 2
๐ ๋ถํํ ์คํธ๋ฅผ ํด๋ณด์
๊ณง ์ต์ข ๋ฐํ๊ฐ ๋จ์ ์์ ์์, ์ค์ ์ฌ์ฉ์๋ฅผ ๋ง์ด ๋ชจ์์ ํ๋ ๊ฒ์ ๋ถ๋ช ํ ํ๊ณ๊ฐ ์๊ธฐ์ ํ ์คํธ๋ฅผ ์งํํ๊ณ ,
๋ฐ์ํ๋ ์๋ฌ๋ค์ ๋ํด ์ต์ ํ๋ฅผ ์งํํด์ฃผ์ด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
์ฌ๊ธฐ์, ๋ถํ ํ ์คํธ์ ์คํธ๋ ์ค ํ ์คํธ์ ์ฐจ์ด๋ ๋ฌด์์ผ๊น ๋ผ๋ ๊ถ๊ธ์ฆ์ ๊ฐ์ง๊ฒ ๋์์ต๋๋ค.
์ฑ๋ฅ ํ ์คํธ๋ ํน์ ์ํฉ์์ ์์คํ ์ ๊ตฌ์ฑ ์์๊ฐ ์ด๋ป๊ฒ ์ํ๋๋์ง ํ์ธํ๊ธฐ ์ํด ์ํ๋๋ ํ ์คํธ์ด๋ค.
์ฑ๋ฅ ํ ์คํธ๋ฅผ ํตํด ์์คํ ์ ์์์ ์ฌ์ฉ๋, ํ์ฅ์ฑ, ์ ๋ขฐ์ฑ ๋ฑ์ ๊ฒ์ฆํ ์ ์๋ค.
โ ํน์ ์๋๋ฆฌ์ค ์ํฉ์์์ API ํ๊ท ์ฒ๋ฆฌ ์๋๋ฅผ ํ์
โ ํ์ฅ์ฑ, ์ ๋ขฐ์ฑ ๋ฐ ๋ฆฌ์์ค ์ฌ์ฉ๊ณผ ๊ฐ์ ์์คํ ์ ๋ค๋ฅธ ํ์ง ์์ฑ์ ์กฐ์ฌ, ์ธก์ , ๊ฒ์ฆ
๋ถํ ํ ์คํธ๋ ์๊ณ๊ฐ ํ๊ณ์ ๋๋ฌํ ๋๊น์ง ์์คํ ์ ๋ถํ๋ฅผ ์ง์์ ์ผ๋ก ๊พธ์คํ ์ฆ๊ฐ์์ผ ์์คํ ์ ์ฑ๋ฅ์ ํ ์คํธํ๋ ๊ฒ์ด๋ค.
๋ถํ ํ ์คํธ๋ ์ ์ ์ ์์ ์ด๋น API ์์ฒญ ๋ฑ์ ์ฆ๊ฐ์ํค๋ฉฐ ์์คํ ์ ๋ด๊ตฌ์ฑ์ ํ ์คํธํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ํฐ๋งํ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๊ณ๋ฅผ ์ฐพ์๋ด๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค.
โ ๋ฒํผ ๋ชจ๋ฒํ๋ก์ฐ, ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ ์๋ชป๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๊ด๋ จ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฒฐํจ์ ๋ ธ์ถํ๋ค.
โ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฏธ๋์ ์์๋๋ ๋ถํ๋ฅผ ๊ด๋ฆฌํ ์ ์๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค, ํ๋์จ์ด, ๋คํธ์ํฌ ๋ฑ์ ๋ชจ๋ ๊ตฌ์ฑ์์์ ์ํ์ ๊ฒฐ์ ํ๋ค.
์คํธ๋ ์ค ํ ์คํธ๋ ๊ธฐ์กด ์์์ ์ด๊ณผ ์์ ์ผ๋ก ๊ณผ๋ถํ๋ฅผ ์ฃผ๋ ๋ค์ํ ํ๋์ ์ํํ๋ฉฐ ์์คํ ์ ๋ฌด๋์ก์ ๋ ์ด๋ค ๋์์ ๋ณด์ด๋์ง ํ์ธํ๋ ํ ์คํธ์ด๋ค.
์์คํ ์ด ์ปค๋ฒํ ์ ์๋ ๋์ญํญ ์ด์์ผ๋ก ๊ณผ๋ถํ๋ฅผ ์ฃผ๋ฉฐ ๊ณผ๋ถํ ์ํ์ผ ๋ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ ์ ์์ ์ผ๋ก ๋ณต๊ตฌ๋๋์ง, ์์คํ ์ด ์ฅ์ ์กฐ์น๋ฅผ ํ๋์ง, ๋ณด์์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ๋ฑ์ ํ์ธํ๋ค
โ ์คํธ๋ ์ค ํ ์คํธ๋ฅผ ํตํด ์ป์ ์ ์๋ ๊ฐ์ฅ ์ด์์ ์ธ ์์คํ ์ ๋ถํ๊ฐ ๊ฑธ๋ ค์ ์์คํ ์ด ๊ณ ์ฅ๋ ์ดํ์๋ ์๋น์ค๊ฐ ์ ์ ์ํ๋ก ๋์์ค๋ ๊ฒ
๊ฐ์ฅ ๋จผ์ , ์ตํ ์๊ณ ์์๊ณ , node์ ํธํ์ฑ์ด ์ข์ k6
๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
k6๋ jsํ์ผ๋ก ์์ฑ์ ํ ์ ์๊ณ , ํด๋ง ์ค์นํ๋ฉด ์ฝ๊ฒ ๋ถํ ํ ์คํธ๋ฅผ ์งํํ ์ ์์๋ค.
๋ค๋ง ๊ณ ๋ คํ์ง ๋ชปํ ์ ์ด ์์๋๋ฐ k6๋ [socket.io](http://socket.io/)
๋ฅผ ์ง์ํ์ง ์๋๋ค.
๋ง์นจ, ๋ถํ ํ ์คํธ ํญ๋ชฉ์ด ์ฌ์ฉ์ ๋ณ ์ฑํ ๋ฐฉ ์ ์ฅ๊ณผ ์ฑํ broadcasting์ด๋ค ๋ณด๋, ํ ์คํธ๋ฅผ ์งํํ ์ ์๋ค๊ณ ํ๋จํ๋ค.
๋ฐ๋ผ์, ๋ค์์ผ๋ก ์ฐพ์๋ณธ ๊ฒ์ artillery
์๋ค.
artillery์ ํน์ง์ yml ํ์ผ๋ก ์คํ์ ํด์ผ ํ๋ค.
์ฝ๋๋ socket.io ๊ณต์ ๋ฌธ์์ load testing ๋ถ๋ถ์ ์ฐธ๊ณ ํ๋ค.
์์ง์ socketio๊ฐ ์๋, socketio-v3์ ์ฌ์ฉํ๋ ๊ฒ์ด artillery ๊ณต์ ๋ฌธ์์์ ์๋ ค์ฃผ๋ ๋ฐฉ์๊ณผ๋ ๋ค๋ฅธ ์ ์ด์๋ค.
๊ทธ๋ฆฌ๊ณ , ์ฑํ ๋ฐฉ ์ ์ฅ์ ์ํด ์ฐ๋ฆฌ๋ roomId๋ฅผ ์ฐ๊ฒฐ์์๋ query๋ก, ์ฑํ ์์๋ data๋ก ๋ฐ์์ค๋๋ฐ, ๋ณ์๋ฅผ ๋ฐ๋ก ์ค์ ํด์ค์ผ ํ๋ค.
4์๊ฐ์ ์ฐ์ฌ๊ณก์ ๋์ ์์ฑ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค
์ผ๋จ artillery - socket v3 ๊ดํด์ ์ค์น๋ฅผ ํด์ค์ผ ํ๋ค.
yarn add artillery-engine-socketio-v3 artillery
๊ทธ๋ฆฌ๊ณ , socket-test.yml ํ์ผ์ ์์ฑํ๋ค.
config:
target: 'http://localhost:3000'
phases:
- duration: 10
arrivalRate: 20
engines:
socketio-v3:
transports: ['websocket']
timeout: 10000
variables:
roomId: '7b82b46b-d705-48a5-9bc5-918ee1a124a0'
scenarios:
- name: 'Chat room flow'
engine: socketio-v3
flow:
- think: 1
- namespace: '/rooms'
connect:
query: 'roomId={{ roomId }}'
headers:
x-forwarded-for: '{{ $randomNumber(1000000, 9999999) }}'
emit:
channel: 'message'
data:
message: 'Test message'
roomId: '{{ roomId }}'
- think: 1
- namespace: '/rooms'
emit:
channel: 'vote'
data:
trackNumber: "{{ $randomNumber(1,2) }}"
- think: 30
์คํ์ ๋ค์๊ณผ ๊ฐ๋ค.
yarn artillery run -e development socket-test.yml
๊ธฐ์กด ์์ ์ฝ๋๋ค์ ๋ณด๋ฉด, ๋ฐฉ ์ ์ฅ ๊ด๋ จ ์๋ฒ ์ฝ๋์์, SubscribeMessage()๋ก ์ฒ๋ฆฌํด์ค์ ๋ชจ๋ emit์ ์ ์ผ๋ผ๊ณ ๋์์๋ค.
๋ค๋ง, ์ฐ๋ฆฌ ์ฝ๋์์๋ handleConnection์ผ๋ก ์ฒ๋ฆฌํด์ฃผ๊ณ ์๊ธฐ ๋๋ฌธ์, emit ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ์ง ์๊ณ , connect ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค.
๋ค๋ง ์ฌ๊ธฐ์, query: {{roomId}}
๋ก๋ง ์ ์๋ค๊ฐ, 1์๊ฐ ์ ๋๋ฅผ ์์ํ ๊ฒ ๊ฐ์๋ฐ, ํ ๋ค์์ ์ ์ด์ค์ผํ๋ค..
query:roomId={{ roomId }}
์ด๋ ๊ฒ ๋ง์ด๋ค.
๋ํ, namespace ๊ด๋ จ emit๊ณผ๋ ๋ค๋ฅด๊ฒ connect๋ ์คํ ์ ์ ์ ์ธ์ ํด์ฃผ์ด์ผํ๋ค.
์ ์ฅ ๋ก๊ทธ๊ฐ ์ ์ฐํ๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
๊ธฐ์กด์๋ namespace๊ฐ ๋ฐฉ ์ ์ฅ ๋ก์ง์์ ์ ์ ํ์์ผ๋, ์ ๋๊ฒ ์ง ๋ผ๊ณ ์๊ฐํด์ ๊ณ์ ์๋ํด๋ดค๋๋ฐ,
message ์ด๋ฒคํธ ๋ก๊ทธ๊ฐ ์์ ๋ฐ์ํ์ง๋ ์์๋ค. ๋ฐ๋ผ์, ์์ธ์ namespace ์ค์ ํ๋๋ฐ์ ์๋ค๊ณ ํ๋จํ์๋ค.
- namespace: '/rooms'
connect:
query: 'roomId={{ roomId }}'
headers:
x-forwarded-for: '{{ $randomNumber(1000000, 9999999) }}'
- think: 2
- emit:
namespace: '/rooms'
channel: "message"
data:
message: "Test message"
roomId: "{{ roomId }}"
- think: 8
์๋ฌด๋ฆฌ namespace ์ค์ ์ ํด๋ด๋ ์ ์ฉ์ด ๋์ง ์์๋ค.
๋ญ๊ฐ ๋ฌธ์ ์ธ๊ฐ ํ๋ค๊ฐ, ๋ฐ๊ฒฌํ ๊ฒ์ด, ์ค๊ฐ์ think: 2 ๋๋ฌธ์ emit์ -
๊ฐ ๋ถ์ด์, connect์ ๋ณ๊ฐ๋ก ์ค์ ๋์ด ์ ์ฉ์ด ๋์ง ์์๋ค.
๊ทธ๋์ think๋ฌธ์ ์ง์ฐ๊ณ , connect์ emit์ ํ๋์ ๋จ๊ณ์์ ์ฒ๋ฆฌํ๋๋ก ๋ณ๊ฒฝํ์๋ค.
- namespace: '/rooms'
connect:
query: 'roomId={{ roomId }}'
headers:
x-forwarded-for: '{{ $randomNumber(1000000, 9999999) }}'
emit:
channel: 'message'
data:
message: 'Test message'
roomId: '{{ roomId }}'
- think: 30
์ด๋ฌ๋ฉด emit์ ๊ฒฝ์ฐ์๋ namespace๋ฅผ ์ ์ฐพ์ ์ ์๊ฒ๋๋ค.
๊ทธ๋ฅ ๋ฐ์ emit์ผ๋ก ํฌํ ๊ด๋ จ ๋ด์ฉ ์ ์ผ๋ฉด ๋๊ฒ ์ง ํ๋๋ฐ, ์๋์๋ค.
์๋ก์ด emit์ ๋ํด์๋ ๋ namespace๋ฅผ ๋ช ์ํด์ค์ผํ๋ค.
flow:
- think: 1
- namespace: '/rooms'
connect:
query: 'roomId={{ roomId }}'
headers:
x-forwarded-for: '{{ $randomNumber(1000000, 9999999) }}'
emit:
channel: 'message'
data:
message: 'Test message'
roomId: '{{ roomId }}'
- think: 1
- namespace: '/rooms'
emit:
channel: 'vote'
data:
trackNumber: "{{ $randomNumber(1,2) }}"
yml ํ์ผ์ด๋ผ ๊ท๊ฒฉ์ด ๋๋ฌด ์ํ๋ค. ๋ค์ฌ์ฐ๊ธฐ, ์คํ์ด์ค ๋ฐ ํ๋๋ง ์๋ชป ๋๋ฌ๋ ๋ฌด์กฐ๊ฑด ์ธ์์กฐ์ฐจ ํ์ง ๋ชปํ๋ค.
์ ๋ง ์ ์ํด์ ๋ค์ฌ์ฐ๊ธฐ๋ฅผ ํด์ผํ๋ค.
- HLS ํ๋กํ ์ฝ์๋ ์ํฅ์ ์ฃผ์ง ์๋๋ค. โ ์์ผ์ ๋ง์ ์ ์์ด ์ด๋ฃจ์ด์ง๋ ๊ฒ๊ณผ๋ ๋ณ๊ฐ๋ก ๋ค์ ์์ ์ด ์ ์คํ๋๋ค.
- ์ฑํ ์ด ์ฌ์ฉ์๊ฐ ๋ง์์ง์๋ก, ๋ ์ด ๊ฑธ๋ฆฌ๋๋ฐ, ์ ์ค๋๋ ์ฑํ ์ ์๋ค.
- ํฌํ๋ ์ฑํ ๋ณด๋ค๋ ๋ ๋๋ฆฌ๊ณ , ๋๋ฆ ์ค์๊ฐ์ผ๋ก ์ ์๋๋๋ค.
- ์ฌ์ฉ์์ ๋๋ค ์์ด๋ ๋ถ์ฌ๊ฐ ๋์ง ์๋๋ค. โ ์ด์ ์ฌ์ฉ์์ ๋๋ค ์์ด๋๊ฐ ์ฒ๋ฆฌ๋๊ธฐ ์ ์ ์ ์ํ๋ ๊ฒ ๊ฐ๋ค.
- message Evnet ์ฒ๋ฆฌํ ๋, randomId๊ฐ ํธ๋ํฝ ๋ชฐ๋ฆผ์ผ๋ก ์ธํ์ฌ ์ ์ ์ฅ์ด ๋์ด ์์ง ์์ ์ด์ ์ธ ์ค ์์์ผ๋,
connect ํ ์ดํ ๋ฐ๋ก message Event๊ฐ ์ฒ๋ฆฌ๋ ๋๊ฐ ์์๋ค. - ๋ฐ๋ผ์, ์ค๊ฐ์ ๋๊ธฐ ์๊ฐ์ ๋ฃ์ด์ฃผ์๋๋ ํด๊ฒฐ๋์๋ค.
- message Evnet ์ฒ๋ฆฌํ ๋, randomId๊ฐ ํธ๋ํฝ ๋ชฐ๋ฆผ์ผ๋ก ์ธํ์ฌ ์ ์ ์ฅ์ด ๋์ด ์์ง ์์ ์ด์ ์ธ ์ค ์์์ผ๋,
=> ๋๋ฆ ์ ์๋ํ๋ค?
artillery
๋ HTML ๋ฆฌํฌํธ๋ ์ง์ํ๋ค.
์ด๊ฑธ ๋ณด๊ธฐ ์ํด์๋, ๋จผ์ ๊ฒฐ๊ณผ๋ฅผ JSON ํ์ผ๋ก ๋ณ๊ฒฝํด์ผํ๋ค.
yarn artillery run -e development socket-test.yml -o report.json
๋ ์ด json ํ์ผ์ html๋ก ๋ณํํ๋ค.
yarn artillery report report.json
๋ค์ด๊ฐ๋ณด๋ฉด,
์ด๋ฐ ์์ผ๋ก ๋์ ๋ณด๊ธฐ ์ฝ๊ฒ ์ ๋ฆฌ๋ฅผ ํด์ค๋ค..!!!
๐ ffmpeg๋ stderr๋ก ๋๋ฒ๊น
์ ํ๋ ์ด์
๐ HLS ํ๋กํ ์ฝ์ ๊ดํ ์ ๋ฆฌ ๋ฐ FFmpeg ์ฌ์ฉ๊ธฐ
๐ ๋นํธ๋ tsconfig.json์ด ์ธ ๊ฐ?
๐ NestJS ๊ธฐ๋ณธ ๊ฐ๋
- Modules
๐ Socket.io ์ต(๊ฐ)์ ํ
๐ ๋์ปค์ nginx์ ์ฌ์ฉ๊ธฐ
๐ ๋ถํํ
์คํธ๋ฅผ ํด๋ณด์
๐ FSD ์ฌ์ฉ๊ธฐ, ๊ทผ๋ฐ ์ด์ ๋๋ง์ ๊ท์น์ ๊ณ๋ค์ธ
๐ CICD ๊ตฌ์กฐ ์์
๐ ์จ๋ฒ ๋จ์๋ก ์คํธ๋ฆฌ๋ฐ ํ๊ธฐ (with HLS)
๐ HLS๋ก ์์
์ฃผ๊ณ ๋ฐ๊ธฐ
๐ vite + react + typescript ํ๊ฒฝ์์ path alias ์ค์
๐ React Scan์ด ๋ญ์ฃ ?
๐ ๋ก์ปฌ ํ๊ฒฝ ๊ฐ๋ฐ ๋ชจ๋ ๋ฐฐํฌ
๐ ์จ๋ฒ ์ ์ฒด๋ฅผ ์คํธ๋ฆฌ๋ฐํ๋ค๊ณ ? (with HLS)
๐ ์ฝ๋์ ์์ ์ฑ์ ๋์ด๊ธฐ ์ํด ํ
์คํธ์ฝ๋๋ฅผ ์์ฑํด๋ณด์
๐ ์๋ก๊ณ ์นจ ์ HLS ERROR
๐ input ํ๊ทธ์ ํ๊ธ ์
๋ ฅ ํ, Enter๋ฅผ ๋๋ฅด๋ฉด ํจ์๊ฐ ๋๋ฒ ํธ์ถ๋๋ ์ค๋ฅ
๐ nginx proxy pass๋ฅผ ๋ฐ๊ฟจ๋๋ ์๊ธด ์๋ฌ - ์ค์จ๊ฑฐ ์ธ์ ๋ฌธ์
๐ ๋ฐฐํฌ ํ๊ฒฝ์์ ํด๋ผ์ด์ธํธ-์๋ฒ WS handshake
๐ ๋ ๋๋ง ๋ฒ์ธ์ ํ๋!
๐ ๊ทธ๋ผ์ด๋ ๋ฃฐ
๐ฅ ํ์ ์๊ฐ
๐ ์ฝ๋ & ๊น ์ปจ๋ฒค์
๐ณ ๊น branch ์ ๋ต
๐ ๋
ธ์
๋ฌธ์ ์ ์ฅ์
๐จ ํผ๊ทธ๋ง
๐งโ๐ป ๊ธฐํ ๊ณต์ ๋ฐํ ์๋ฃ
๐ค 2์ฃผ์ฐจ ๋ฐํ ์๋ฃ
๐ ๋ฐฑ๋ก๊ทธ
๐ 1์ฃผ์ฐจ
๐ 2์ฃผ์ฐจ
๐ 3์ฃผ์ฐจ
๐ 4์ฃผ์ฐจ
๐ 5์ฃผ์ฐจ
๐๏ธ 1์ฃผ์ฐจ
๐๏ธ 2์ฃผ์ฐจ
๐๏ธ 3์ฃผ์ฐจ
๐๏ธ 4์ฃผ์ฐจ
๐๏ธ 5์ฃผ์ฐจ
โจ 1์ฃผ์ฐจ
โจ 2์ฃผ์ฐจ
โจ 3์ฃผ์ฐจ
โจ 4์ฃผ์ฐจ