์ค์๊ฐ ์ฑํ ์ WebSocket์ด ๊ผญ ํ์ํ ๊น? Polling์ผ๋ก ๋ค์ ๋ง๋ ๋ผ์ด๋ธ ์ฑํ
- #Backend
- #Polling
- #Redis
- #AWS
- #Migration
- #Fromm
๋ค์ด๊ฐ๋ฉฐ
์๋ ํ์ธ์. ํ๋กฌ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ์ด๋์ฐ์ ๋๋ค.
ํ๋กฌ์ ๋ผ์ด๋ธ ๋ฐฉ์ก์๋ ์ํฐ์คํธ์ ํฌ์ด ์ค์๊ฐ์ผ๋ก ๋ํํ ์ ์๋ ๋ผ์ด๋ธ ์ฑํ ์ด ์์ต๋๋ค. ์๋๋ ์๋ํํฐ ์ฑํ ์๋ฃจ์ ์ ์ฐ๊ณ ์์๋๋ฐ์. ์์ ์ ์ธ SDK์ ๋ค์ํ ๊ธฐ๋ฅ์ ๋น ๋ฅด๊ฒ ์ฌ์ฉํ ์ ์๋ค๋ ์ฅ์ ์ด ์์์ง๋ง, ์ ํฌ๊ฐ ์ค์ ๋ก ์ฐ๋ ๊ธฐ๋ฅ์ ์๋ฃจ์ ์ด ์ ๊ณตํ๋ ์ ์ฒด ์ค ์ผ๋ถ์ ๋ถ๊ณผํ์ต๋๋ค.
๋ฐฉ์ก์ด ๋๋๋ฉด ์ฑํ ๊ธฐ๋ก์ ์ค๋ ๋ณด๊ดํ ํ์๋ ์์๊ณ , ๋ฐฉ์ก ์ค์๋ ์ต์ ํ๋ฆ์ ์ ๋ณด์ฌ์ฃผ๊ณ ์ด์ ์ด๋ฒคํธโ์ฑํ ์ผ๋ฆฌ๊ธฐ, ๋ฎคํธ, ๋ฐด ๊ฐ์ ๊ฒ๋คโ๋ฅผ ๋น ๋จ๋ฆฌ์ง ์๋ ๊ฒ ๋ ์ค์ํ์ต๋๋ค.
๊ฒฐ๊ตญ ์ ํฌ์๊ฒ ํ์ํ ๊ฑด ๋ฒ์ฉ ๋ฉ์ ์ ๊ฐ ์๋๋ผ, ๋ผ์ด๋ธ ๋ฐฉ์ก์ ํน์ฑ์ ๋ง๋ ์ผํ์ฑ ์ฑํ ์์คํ ์ด์์ต๋๋ค.
์ฒ์์ โ์ค์๊ฐ ์ฑํ ์ ์ง์ ๋ง๋ ๋คโ๊ณ ํ๋ฉด ์์ฐ์ค๋ฝ๊ฒ WebSocket์ ๋ ์ฌ๋ ธ์ต๋๋ค. SSE๋ ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก Pushํ ์ ์์ผ๋ฉด์ HTTP ๊ธฐ๋ฐ์ด๋ผ ์ ๋ ฅํ ํ๋ณด์๊ณ ์. ๊ทธ๋ฐ๋ฐ ์๊ตฌ์ฌํญ์ ๋ค์ ๋ค์ฌ๋ค๋ณด๋ ๊ตณ์ด ์ฐ๊ฒฐ์ ์ ์งํด์ผ ํ ์ด์ ๊ฐ ์์์ต๋๋ค. 1~2์ด ์ ๋์ ์ง์ฐ์ ํ์ฉํ ์ ์์๊ณ , ํด๋ผ์ด์ธํธ๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ์ํ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ผ๋ก๋ ์ถฉ๋ถํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ์งํ ์ ์์๊ฑฐ๋ ์.
์ด ๊ธ์์๋ ์ธ๋ถ ์ฑํ ์๋ฃจ์ ์ ์์ฒด Polling ์๋น์ค๋ก ์ฌ๊ตฌ์ถํ๋ฉด์ ์ด๋ค ๊ธฐ์ค์ผ๋ก ๊ธฐ์ ์ ์ ํํ๋์ง, ๋ฉ์์ง ์ฐ์ ์์์ ์กฐํ ์ ์ฑ ์ ์ด๋ป๊ฒ ์ค๊ณํ๋์ง, ๊ทธ๋ฆฌ๊ณ ๋ถํ ํ ์คํธ ์ค์ ๋ฐ๊ฒฌํ cursor ์ง์ฐ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ๊ณต์ ํด๋ณด๊ฒ ์ต๋๋ค.
์๊ตฌ์ฌํญ๋ถํฐ ๋ค์ ์ ์ํ๊ธฐ
์์ฒด ๊ตฌ์ถ์ ๊ฒํ ํ๋ฉด์ ๊ฐ์ฅ ๋จผ์ ํ ๊ฑด โ๊ธฐ์กด ์ธ๋ถ ์๋ฃจ์ ์ ๊ทธ๋๋ก ๋ณต์ ํ์โ๊ฐ ์๋๋ผ, ๋ผ์ด๋ธ ์ฑํ ์ ์ ๋ง ํ์ํ ๊ฒ ๋ญ์ง ๋ค์ ์ ๋ฆฌํ๋ ๊ฑฐ์์ต๋๋ค.
| ๊ตฌ๋ถ | ์๊ตฌ์ฌํญ |
|---|---|
| ๋์ ์ ์ | ํ๋์ ๋ผ์ด๋ธ ์ฑํ ๋ฐฉ์ ์์ฒ~1๋ง ๋ช ์ด ์ฐธ์ฌํ ์ ์์ด์ผ ํจ |
| ์ฒด๊ฐ ์ค์๊ฐ์ฑ | 1~2์ด ์ ๋์ ๋ฉ์์ง ์์ ์ง์ฐ ํ์ฉ |
| ์ํฐ์คํธ ๋ฉ์์ง | ๋ชจ๋ ์ฐธ์ฌ์์๊ฒ ์ ๋ฌ๋์ด์ผ ํจ |
| ํฌ ๋ฉ์์ง | ํธ๋ํฝ์ด ๋ชฐ๋ ค๋ ์ต์ ์ฑํ ํ๋ฆ์ ์์ ์ ์ผ๋ก ์ ์งํด์ผ ํจ |
| ์ด์ ์ด๋ฒคํธ | ์ญ์ , ์ผ๋ฆฌ๊ธฐ, ๋ฎคํธ, ๋ฐด์ ๋ชจ๋ ์ฐธ์ฌ์์๊ฒ ์ ๋ฌ๋์ด์ผ ํจ |
| ์ ์ฅ | ๋ฐฉ์ก ์ข ๋ฃ ํ ์๊ตฌ ๋ณด๊ดํ ํ์ ์์ |
| ์กฐํ | ์๋ต ํฌ๊ธฐ์ ์ง์ฐ ์๊ฐ์ ์์ธก ๊ฐ๋ฅํ ๋ฒ์๋ก ์ ์งํด์ผ ํจ |
์ ๋ฆฌํ๊ณ ๋๋ ํ ๊ฐ์ง ์ฌ์ค์ด ๋์ ๋ค์ด์์ต๋๋ค.
๋ชจ๋ ๋ฉ์์ง๊ฐ ๊ฐ์ ์ค์๋๋ฅผ ๊ฐ์ง ์๋๋ค๋ ๊ฒ์ด์์ต๋๋ค.
์ํฐ์คํธ ๋ฉ์์ง๋ ํฌ ๋ชจ๋๊ฐ ๊ผญ ๋ด์ผ ํ์ง๋ง, ํฌ ๋ฉ์์ง๋ ์งง์ ์๊ฐ์ ๊ธ๊ฒฉํ ๋์ด๋ ์ ์์ต๋๋ค. ํ๋ฉด๊ณผ API๊ฐ ์ต์ ํ๋ฆ์ ์ ๋ณด์ฌ์ฃผ๋ ค๋ฉด ์ฒ๋ฆฌ๋์ ์ด๋ ์ ๋ ์ ์ดํด์ผ ํ๊ณ ์.
๊ทธ๋ ๋ค๋ฉด ์๋ฒ๋ ๋ชจ๋ ๋ฉ์์ง๋ฅผ ๋๊ฐ์ด ๋ค๋ฃฐ ํ์๊ฐ ์์์ต๋๋ค. ๊ฐํ ์ ๋ฌ ๋ณด์ฅ์ด ํ์ํ ๋ฐ์ดํฐ์ ํธ๋ํฝ ๋ณ๋์ด ํฐ ๋ฐ์ดํฐ๋ฅผ ๋๋๋ฉด ์์คํ ์ด ํจ์ฌ ๋จ์ํด์ง ์ ์์์ต๋๋ค.
WebSocket, SSE, Polling ๋น๊ตํ๊ธฐ
WebSocket์ ์๋ฐฉํฅ ํต์ ๊ณผ ๋ฎ์ ์ง์ฐ์ด ์ค์ํ ์ฑํ ์๋น์ค์ ์ ๋ง์ต๋๋ค. ๋ค๋ง ์ฐ๊ฒฐ์ ๊ณ์ ์ ์งํด์ผ ํ๋ค ๋ณด๋ ์ฌ์ฐ๊ฒฐ, ์๋ฒ ํ์ฅ, ์ธ์ ๋ถ์ฐ ๊ฐ์ ์ด์ ๋ณต์ก๋๊ฐ ๋ฐ๋ผ์ต๋๋ค. ์ ํฌ๋ ๋ฉ์์ง ์ ์ก ์์ฒด๋ HTTP API๋ก ์ฒ๋ฆฌํ ์ ์์๊ณ , ์์ ๋ง์ ์ํด ์๋ฐฉํฅ ์ฐ๊ฒฐ์ ์ ์งํ๋ ๊ฑด ์ข ๊ณผํ์ต๋๋ค.
๊ทธ๋์ WebSocket๋ง ๊ฒํ ํ์ง ์์์ต๋๋ค. SSE์ Polling๋ ํจ๊ป ์ดํด๋ณด๋ฉด์ ์ค์ PoC์ ๋ถํ ํ ์คํธ๊น์ง ์งํํ์ต๋๋ค.
| ๋ฐฉ์ | ์ฅ์ | ๊ณ ๋ คํ ์ |
|---|---|---|
| WebSocket | ์๋ฐฉํฅ ํต์ , ๋ฎ์ ์ง์ฐ | ์ฐ๊ฒฐ ๋ถ์ฐ, ์ฌ์ฐ๊ฒฐ, ์ธ์ ๊ด๋ฆฌ๊ฐ ํ์ํจ |
| SSE | HTTP ๊ธฐ๋ฐ์ ๋จ๋ฐฉํฅ Push, ๋ฐ์ด๋ ์ค์๊ฐ์ฑ | ์ฅ๊ธฐ ์ฐ๊ฒฐ์ ์ ์งํ ์๋ฒ์ ์ฌ์ฐ๊ฒฐ ํ ์ํ ๋ณต๊ตฌ๊ฐ ํ์ํจ |
| Polling | Stateless REST API, ์ฅ์ ๋ณต๊ตฌ์ ํ์ฅ์ด ๋จ์ํจ | ๋น ์์ฒญ์ด ๋ฐ์ํ๋ฉฐ Polling ์ฃผ๊ธฐ๋งํผ ์ง์ฐ๋จ |
SSE PoC๋ ECS๊ฐ Redis Pub/Sub๋ฅผ ๊ตฌ๋ ํ๊ณ ์ฐ๊ฒฐ๋ ํด๋ผ์ด์ธํธ์ ์ด๋ฒคํธ๋ฅผ Pushํ๋ ๊ตฌ์กฐ์์ต๋๋ค. ์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋์ ๋ค๋ ์ค๊ฑฐ๋ ๋คํธ์ํฌ๊ฐ ๋๊ฒผ์ ๋๋ฅผ ์ํด Redis Stream๊ณผ ๋ณต๊ตฌ API๋ ํจ๊ป ์ค๊ณํ์ต๋๋ค.
๋ฎ์ ๋ถํ์์ SSE๋ ์ ms ์์ค์ผ๋ก ๋ฉ์์ง๋ฅผ ์ ๋ฌํด ์ค์๊ฐ์ฑ๋ง ๋ฐ์ง๋ฉด ๊ฐ์ฅ ์ข์์ต๋๋ค. ํ์ง๋ง 5,000๋ช ์ด์์ ๊ณ ๋ถํ ์๋๋ฆฌ์ค์์๋ ์ง์ฐ์ด ๊ธ๊ฒฉํ ๋์๊ณ ์ฌ์ฐ๊ฒฐ๋ ๋ฐ์ํ๊ธฐ ์์ํ์ต๋๋ค. ์ฐ๊ฒฐ ์์ ๋ง์ถฐ ECS ์ฉ๋์ ๊ณํํด์ผ ํ๊ณ , ๋ฐฐํฌํ ๋๋ง๋ค ์ฐ๊ฒฐ ์ฌ์ค์ ๊ณผ ์ํ ๋ณต๊ตฌ๋ ์ ๊ฒฝ ์จ์ผ ํ์ต๋๋ค.
Polling์ ๋ฉ์์ง๊ฐ ์์ด๋ ์์ฒญ์ด ๋ฐ์ํ๊ณ 1~2์ด์ ์ง์ฐ์ด ์์์ง๋ง, ๋ถํ๊ฐ ๋์ด๋๋ ์ง์ฐ์ ์์ธกํ๊ธฐ ์ด๋ ต์ง ์์์ต๋๋ค. ์์ฒญ์ด Statelessํ๋๊น ๋คํธ์ํฌ๊ฐ ์ ๊น ๋๊ฒจ๋ ๋ค์ Polling์์ ์์ฐ์ค๋ฝ๊ฒ ๋ณต๊ตฌ๋๊ณ , ์๋ฒ ์ฌ์์์ด ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ์ ์ํฅ์ ์ฃผ์ง ์์์ต๋๋ค.
๋น์ฉ๋ Polling์ด ์ ๋ฆฌํ์ต๋๋ค. SSE๋ ๋ผ์ด๋ธ๊ฐ ์๋ ์๊ฐ์๋ ECS ์ธ์คํด์ค๋ฅผ ์ ์งํด์ผ ํ์ง๋ง, Polling์ Lambda ๊ธฐ๋ฐ์ด๋ผ ์ค์ ์์ฒญ์ด ์์ผ๋ฉด ์ปดํจํ ๋น์ฉ์ด ๊ฑฐ์ ์์ต๋๋ค. ์ค์ ๋ผ์ด๋ธ ํ์์ ํ๊ท ์์ฒญ ์ธ์์ ๊ธฐ์ค์ผ๋ก ์ถ์ฐํด๋ดค์ ๋๋ Polling์ด ๊ฐ์ฅ ์ ๋ ดํ์ต๋๋ค.
๊ฒฐ๊ตญ ์ ํ ๊ธฐ์ค์ โ๊ฐ์ฅ ๋น ๋ฅธ ๋ฐฉ์โ์ด ์๋์์ต๋๋ค. ์๋น์ค๊ฐ ํ์ฉํ๋ ์ง์ฐ ์์์ ์ด์ ๋ณต์ก๋์ ๋น์ฉ์ด ๊ฐ์ฅ ๋ฎ์ ๋ฐฉ์์ ๊ณจ๋๊ณ , ๋ค์ ์กฐ๊ฑด๋ค์ด Polling๊ณผ ์ ๋ง์๋จ์ด์ก์ต๋๋ค.
- 1~2์ด์ ์ง์ฐ์ ํ์ฉํ ์ ์๋ค.
- ์๋ต ๋ฐ์ดํฐ๋ฅผ ์๊ฒ ์ ์งํ ์ ์๋ค.
- ๋ฉ์์ง๋ฅผ ์๊ตฌ ์ ์ฅํ์ง ์์๋ ๋๋ค.
- ์๋ต ํฌ๊ธฐ์ ์กฐํ ๋ฒ์๋ฅผ ์ผ์ ํ๊ฒ ์ ํํ ์ ์๋ค.
- ์๋ฒ๋ฆฌ์ค ์ธํ๋ผ๋ฅผ ์ด์ฉํด ์์ฒญ๋์ ๋ฐ๋ผ ํ์ฅํ ์ ์๋ค.
๋ฉ์์ง ์กฐํ์ ๋ฐฉ ์ํ ์กฐํ์ ์ฃผ๊ธฐ๋ ๋ฐ๋ก ๋๋ด์ต๋๋ค.
| Polling ๋์ | ์ฃผ๊ธฐ | ์ด์ |
|---|---|---|
| ํธ์คํธ์ ๋ฉ์์ง ์กฐํ | 1์ด | ๋ฐฉ์ก ์งํ์๊ฐ ํฌ ๋ฐ์์ ๋น ๋ฅด๊ฒ ํ์ธํด์ผ ํจ |
| ์์ฒญ์์ ๋ฉ์์ง ์กฐํ | 2์ด | ์ฒด๊ฐ ์ค์๊ฐ์ฑ์ ์ ์งํ๋ฉด์ ์์ฒญ ์๋ฅผ ์ค์ |
| ๋ฐฉ ์ํ | 5์ด | ์ข์์, ์ผ๋ฆฌ๊ธฐ, ๋ฎคํธ, ๋ฐด์ ๋ฉ์์ง๋ณด๋ค ๋ฎ์ ์กฐํ ๋น๋๋ก ์ถฉ๋ถํจ |
๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ 1์ด๋ง๋ค ์์ฒญํ๋ ๋์ , ๋ณํ ๋น๋์ ์ค์๋์ ๋ฐ๋ผ ์ฃผ๊ธฐ๋ฅผ ๋๋ ๋ถํ์ํ ๋ถํ๋ฅผ ์ค์์ต๋๋ค.
์ ์ฒด ์ํคํ ์ฒ
๋ผ์ด๋ธ ์ฑํ Polling ์๋น์ค์ ๋ฉ์์ง ์ ์ก ๋ฐ ์กฐํ ๊ตฌ์กฐ
์ ์ฒด ์์คํ ์ API Gateway, Lambda, SQS, Redis๋ฅผ ์ค์ฌ์ผ๋ก ๊ตฌ์ฑํ์ต๋๋ค.
์ผ๋ฐ ํฌ ๋ฉ์์ง๋ API Gateway์์ ๋ฐ๋ก SQS๋ก ์ ๋ฌํฉ๋๋ค. ์ด ๊ฒฝ๋ก์๋ Lambda๋ฅผ ๋ฐ๋ก ๋์ง ์์๋๋ฐ์. API Gateway์ AWS ์๋น์ค ์ง์ ํตํฉ์ ์ฌ์ฉํด JWT Authorizer๋ฅผ ํต๊ณผํ ์์ฒญ ๋ณธ๋ฌธ์ SQS-SendMessage๋ก ์ ๋ฌํ๊ณ , ์ดํ Lambda Consumer๊ฐ ๋ฉ์์ง๋ฅผ ๊ฒ์ฆํด Redis์ ์ ์ฅํ๋ ๋ฐฉ์์
๋๋ค.
์ผ๋ฐ ๋ฉ์์ง๋ ํฌ ์์ ๋น๋กํด ๊ฐ์ฅ ๋ง์ ์์ฒญ์ด ๋ฐ์ํ๋ ๊ฒฝ๋ก์
๋๋ค. API Gateway -> Lambda -> SQS๋ก ๊ตฌ์ฑํ๋ฉด Lambda๋ ํ์ ๋ฃ๋ ์งง์ ์์
๋ง ๋ฐ๋ณตํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฅผ API Gateway -> SQS๋ก ์ค์ด๋ฉด Lambda ํธ์ถ๊ณผ ๋์์ฑ ์ฌ์ฉ์ ์์จ ์ ์๊ณ , ๋น์ฉ๊ณผ ์ฅ์ ์ง์ ๋ ํจ๊ป ์ค์ด๋ญ๋๋ค. ์์ฒญ์ด ๋ชฐ๋ฆฌ๋ ์๊ฐ์๋ SQS๊ฐ ๋ฒํผ ์ญํ ์ ํด์ Consumer๊ฐ ๊ฐ๋นํ ์ ์๋ ์๋๋ก ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ฉด ์ํฐ์คํธ์ ์ด์์ ๋ฉ์์ง๋ ๋ณ๋์ Lambda๋ฅผ ํตํด Redis์ ๋ฐ๋ก ์ ์ฅํฉ๋๋ค. ์ผ๋ฐ ๋ฉ์์ง ํ ํธ๋ํฝ ๋๋ฌธ์ ์ค์ํ ๋ฉ์์ง๊ฐ ๋ฆ์ด์ง๋ ๊ฑธ ๋ง๊ธฐ ์ํด ๊ฒฝ๋ก๋ฅผ ๋ถ๋ฆฌํ ๊ฒ๋๋ค.
์ผ๋ฐ ๋ฉ์์ง: Client -> API Gateway -> SQS -> Lambda -> Redis
์ค์ ๋ฉ์์ง: Client -> API Gateway -> Lambda -> Redis
๋ฉ์์ง ์์ : Client -> API Gateway -> Lambda -> Redis
์ข์์๋ ๋ชจ๋ ํด๋ฆญ์ ์ฆ์ ๋๊ธฐํํ ํ์๋ ์์ด์, ํด๋ผ์ด์ธํธ์์ ์ผ์ ์๊ฐ ๋์ ์ฆ๊ฐ๋์ ๋ชจ์ ์ ์กํ๊ณ SQS์ Lambda๋ฅผ ํตํด Redis ์นด์ดํฐ์ ๋ฐ์ํ๋๋ก ํ์ต๋๋ค.
Redis Sorted Set๊ณผ Cursor
๋ผ์ด๋ธ ์ฑํ ๋ฐ์ดํฐ๋ ๋ฐฉ์ก ์ค์๋ง ํ์ํฉ๋๋ค. RDB์ ์๊ตฌ ์ ์ฅํ๊ณ ์กฐํํ๋ ๊ฒ๋ณด๋ค Redis์ ์งง๊ฒ ๋ณด๊ดํ๋ ํธ์ด ์๊ตฌ์ฌํญ์ ํจ์ฌ ์ ๋ง์์ต๋๋ค.
๋ฉ์์ง๋ Redis Sorted Set์ ์ ์ฅํ์ต๋๋ค. score์๋ ์๋ฒ๊ฐ ๋ฉ์์ง๋ฅผ ์ ์ฅํ ์๊ฐ์, member์๋ ๋ฉ์์ง ๋ฐ์ดํฐ๋ฅผ JSON์ผ๋ก ์ ์ฅํฉ๋๋ค.
Key: live_chat:{roomId}:messages:{priority}
Score: createdAt
Member: { messageId, content, userId, nickname, createdAt }
TTL: 24์๊ฐ
ํด๋ผ์ด์ธํธ๋ ๋ง์ง๋ง์ผ๋ก ํ์ธํ cursor๋ฅผ ๋ค์ ์์ฒญ์ ํฌํจํฉ๋๋ค.
GET /live-chat/{roomId}/messages?cursor=1710000000000
์๋ฒ๋ cursor ์ดํ์ ์ ์ฅ๋ ๋ฉ์์ง๋ฅผ ์กฐํํ๊ณ , ์๋ต์ ๋ค์ cursor๋ฅผ ํจ๊ป ๋ด๋ ค์ค๋๋ค. ํด๋ผ์ด์ธํธ๋ ์๋ต์ด ์ฑ๊ณตํ ๊ฒฝ์ฐ์๋ง cursor๋ฅผ ๊ฐฑ์ ํฉ๋๋ค. ์ผ์์ ์ธ ๋คํธ์ํฌ ์ค๋ฅ๊ฐ ์๊ธฐ๋ฉด ๊ธฐ์กด cursor๋ฅผ ์ ์งํ ์ฑ ๋ค์ Polling์์ ๋ค์ ์์ฒญํ๋๊น ๋ณ๋์ ์ฐ๊ฒฐ ๋ณต๊ตฌ ํ๋กํ ์ฝ์ด ํ์ํ์ง ์์ต๋๋ค.
์ฐ์ ์์์ ๋ฐ๋ผ ์กฐํ ์ ์ฑ ์ ๋ฌ๋ฆฌ ๊ฐ์ ธ๊ฐ์ต๋๋ค.
์ฐ์ ์์ ๋์ ๋ฉ์์ง
์ํฐ์คํธ์ ์ด์์์ ๋ฉ์์ง๋ cursor ์ดํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์กฐํํฉ๋๋ค.
ZRANGEBYSCORE live_chat:{roomId}:messages:high cursor+1 +inf
์ค์ ๋ฉ์์ง๋ ์๊ฐ ๋ง์ง ์๊ณ ์ ๋ฌ์ด ๋ณด์ฅ๋์ด์ผ ํด์ ๋๋ฝ ์์ด ๋ฐํํฉ๋๋ค.
์ผ๋ฐ ๋ฉ์์ง
์ผ๋ฐ ๋ฉ์์ง๋ ํธ๋ํฝ ๋ณ๋์ด ํฌ๊ธฐ ๋๋ฌธ์ ์กฐํ ๋ฒ์์ ์ํ์ ๋๊ณ ์ต์ ๊ตฌ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์๋ต์ ๊ตฌ์ฑํ์ต๋๋ค.
์กฐํ ๊ธฐ์ค: cursor ์ดํ ๋ฐ์ดํฐ
์ ๋ ฌ ๊ธฐ์ค: ์ต์ ๊ตฌ๊ฐ ์ฐ์
์๋ต ๊ธฐ์ค: ๊ณ ์ ๋ pageSize ์์์ ๊ตฌ์ฑ
์กฐํ ๊ฒฐ๊ณผ๋ ์๊ฐ์์ผ๋ก ๋ค์ ์ ๋ ฌํ ๋ค ์ฐ์ ์์ ๋์ ๋ฉ์์ง์ ํฉ์ณ ๋ฐํํฉ๋๋ค. ํธ๋ํฝ์ด ๊ธ์ฆํด๋ ์๋ต ํฌ๊ธฐ์ Lambda ์ฒ๋ฆฌ๋์ด ์์ธก ๊ฐ๋ฅํ ๋ฒ์ ์์ ๋จธ๋ฌผ๋๋ก ํ์ต๋๋ค.
๋ฉ์์ง ์ญ์ ์ด๋ฒคํธ๋ ๋ณ๋์ Sorted Set์ deletedAt์ score๋ก ์ ์ฅํ์ต๋๋ค. ๋ฉ์์ง์ ์ญ์ ์ด๋ฒคํธ๋ฅผ ํจ๊ป ์กฐํํ ํ ๊ฐ์ฅ ์ต์ ์๊ฐ์ ๋ค์ cursor๋ก ์ฌ์ฉํ์ฌ, ์ญ์ ์ด๋ฒคํธ๋ง ๋ฐ์ํ Polling์์๋ cursor๊ฐ ์ ์์ ์ผ๋ก ์ ์งํ๋๋ก ํ์ต๋๋ค.
30์ด ์ ๋ฉ์์ง๊ฐ ๋์ฐฉํ ์ด์
๋ถํ ํ ์คํธ ์ค์ ๊ฐ์ ํด๋ผ์ด์ธํธ๋ฅผ 500๋ช ์์ 1,000๋ช ์ผ๋ก ๋๋ฆฌ์ ์ด์ํ ํ์์ด ๋ํ๋ฌ์ต๋๋ค. Polling API ์๋ต ์๊ฐ์ ์ ์์ธ๋ฐ, ํด๋ผ์ด์ธํธ๊ฐ ์์ ์ด ๋ณด๋ธ ๋ฉ์์ง๋ฅผ ๋ค์ ์์ ํ๊ธฐ๊น์ง์ Round Trip์ด ์ ์ ๊ธธ์ด์ง๋๋ 30์ด๋ฅผ ๋์ด๊ฐ์ต๋๋ค.
์ฒ์์ ๋ฉํธ๋ฆญ ์ค์ ์ ์์ฌํ์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์ธก์ ๊ตฌ๊ฐ์ ๋๋ ค๋ณด๋ ํ ์คํธ๊ฐ ์งํ๋ ์๋ก ์ง์ฐ์ด ์ ํ์ ์ผ๋ก ์ฆ๊ฐํ๊ณ ์์์ต๋๋ค. API๊ฐ ๋๋ฆฐ ๊ฒ ์๋๋ผ ํด๋ผ์ด์ธํธ์ cursor๊ฐ ํ์ฌ ์๊ฐ์ ๋ฐ๋ผ์ก์ง ๋ชปํ๊ณ ์๋ ๊ฒ๋๋ค.
๋น์ ์ผ๋ฐ ๋ฉ์์ง๋ cursor ์งํ ๊ตฌ๊ฐ๋ถํฐ ์์๋๋ก ๋ฐ๋ผ๊ฐ๋ ๋ฐฉ์์ด์์ต๋๋ค.
๊ธฐ์กด: cursor ์งํ ๊ตฌ๊ฐ๋ถํฐ ์์ฐจ ์กฐํ
ํธ๋ํฝ์ด ์๊ฐ์ ์ผ๋ก ์กฐํ ํ๋๋ฅผ ๋์ผ๋ฉด ํด๋ผ์ด์ธํธ๋ ์ด๋ฏธ ์ค๋๋ ๊ตฌ๊ฐ์ ๊ณ์ ๋ฐ๋ผ๊ฐ๊ฒ ๋ฉ๋๋ค. ์ ๋ฉ์์ง๊ฐ ์์ด๋ ์๋๋ฅผ ์ฒ๋ฆฌ ์๋๊ฐ ๋ฐ๋ผ๊ฐ์ง ๋ชปํ๋, cursor๋ ์์ํ ํ์ฌ ์์ ์ ๋ฐ๋ผ์ก์ ์ ์๊ฒ ๋ฉ๋๋ค.
์ฒ์ ์๋ํ ๊ฑด cursor ์ดํ ๋ฒ์๋ฅผ ๋๊ฒ ์กฐํํ ๋ค ๋ค์ cursor๋ฅผ ์ต์ ์์ ์ผ๋ก ๋ฐ๋ก ์ด๋ํ๋ ๋ฐฉ๋ฒ์ด์์ต๋๋ค. ์ง์ฐ์ ์ค์์ง๋ง, ํธ๋ํฝ์ด ์ปค์ง๋ฉด Redis์์ ์ฝ์ด์ค๋ ๋ฐ์ดํฐ์ Lambda ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋์ด๋ ์ ์์์ต๋๋ค.
์ต์ข ์ ์ผ๋ก๋ ์กฐํ ๋ฐฉํฅ์ ๋ค์ง์์ต๋๋ค.
๋ณ๊ฒฝ: ์ต์ ๊ตฌ๊ฐ ๊ธฐ์ค ์กฐํ
์ต์ ๊ตฌ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์กฐํํ๋ฉด ๋ฐ์ดํฐ ์์ ์ ํํ๋ฉด์๋ cursor๋ฅผ ํ์ฌ ์์ ์ผ๋ก ๋น ๋ฅด๊ฒ ์ด๋์ํฌ ์ ์์ต๋๋ค. ์์ ํ ๋์ผํ ์กฐ๊ฑด์์ Round Trip์ด 5์ด ์ด๋ด๋ก ์ค์๊ณ , 3,000๋ช ยท5,000๋ช ์กฐ๊ฑด์์๋ ๊ฐ์ ๋ฒ์ ์์์ ๋์ํ๋ ๊ฑธ ํ์ธํ์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ๊ฒช์ผ๋ฉด์ cursor๋ ๋จ์ํ โ๋ง์ง๋ง์ผ๋ก ๋ฐํํ ๋ฐ์ดํฐ์ ์์นโ๊ฐ ์๋๋ผ, ์์คํ ์ด ์ด๋๊น์ง ์ฒ๋ฆฌํ๋ค๊ณ ๊ฐ์ฃผํ ๊ฒ์ธ์ง์ ๋ํ ์ ์ฑ ์ด๋ผ๋ ๊ฑธ ์๊ฒ ๋์ต๋๋ค. ํธ๋ํฝ์ด ํฐ ์ค์๊ฐ ํ๋ฉด์์๋ ์ค๋๋ ๊ตฌ๊ฐ์ ์์๋๋ก ๋ฐ๋ผ๊ฐ๋ ๊ฒ๋ณด๋ค, ์ต์ ์ํ๋ฅผ ์์ ์ ์ผ๋ก ์ ์งํ๋ cursor ์ ์ฑ ์ด ๋ ์ค์ํ ์ ์์ต๋๋ค.
์ฑ์์๋ ๊ธฐ์กด ๊ตฌ์กฐ๋ฅผ ์ต๋ํ ์ ์งํ๊ธฐ
์๋ฒ๋ฅผ ๊ต์ฒดํ๋ ๋์ ์ฑ์ ๋ผ์ด๋ธ ํ๋ฉด ์ ์ฒด๋ฅผ ๋ค์๊ณ ์ถ์ง ์์์ต๋๋ค. ๊ธฐ์กด ์ฑ์๋ ์ฑํ ๋ฐ์ดํฐ์์ค ์ธํฐํ์ด์ค ๋ค์ ์ธ๋ถ ์๋ฃจ์ ๊ตฌํ์ฒด๊ฐ ์ฐ๊ฒฐ๋์ด ์์๊ธฐ ๋๋ฌธ์, ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๋ฐ๋ฅด๋ Polling ๊ตฌํ์ฒด๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
if chatProvider == .fromm {
liveChatDataSource = PollingLiveChatDataSource(apiService: liveChatAPIService)
} else {
liveChatDataSource = ExternalLiveChatDataSource()
}
๋ฉ์์ง ์์ ์ SDK์ ์ด๋ฒคํธ ์คํธ๋ฆผ ๋์ Polling ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์กด ์คํธ๋ฆผ ํํ๋ก ๋ณํํด ์ ๋ฌํ์ต๋๋ค. UI์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ฐ์ดํฐ๊ฐ ์ด๋์ ์๋์ง ์ ํ์๊ฐ ์๊ฒ ๋์ต๋๋ค.
์ ์ง์ ์ ํ์ ์ํด App Config์ ์ ์ฒด ์ ์ฉ ์ฌ๋ถ์ ๋์ ์ํฐ์คํธ ๋ชฉ๋ก๋ ๋์ต๋๋ค.
{
"apply_all": false,
"apply_target_list": ["artist-id"]
}
์ฒ์์ ๋ด๋ถ ํ ์คํธ ๋์์๋ง Polling์ ์ ์ฉํ๊ณ , ์ดํ ์ผ๋ถ ๋ผ์ด๋ธ๋ฅผ ๊ฑฐ์ณ ์ ์ฒด๋ก ํ๋ํ์ต๋๋ค. ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ์ฑ ์ ๋ฐ์ดํธ ์์ด ๊ธฐ์กด ์ธ๋ถ ์๋ฃจ์ ์ผ๋ก ๋๋๋ฆด ์ ์๋ค๋ ์ ๋ ๋ง์ด๊ทธ๋ ์ด์ ๊ณผ์ ์์ ํฐ ์์ ๋ง์ด ๋์ต๋๋ค.
๋ฐฑ๊ทธ๋ผ์ด๋์์๋ ๋ถํ์ํ Polling์ ์ค๋จํ๊ณ , ํฌ๊ทธ๋ผ์ด๋๋ก ๋์์ค๋ฉด ๋ค์ ์์ํ๋๋ก ๋ผ์ดํ์ฌ์ดํด๊ณผ๋ ์ฐ๊ฒฐํ์ต๋๋ค. ์ฌ๊ฐํ ๋ ๊ธฐ์กด cursor๋ฅผ ์ฌ์ฉํด ์ค๋จ๋ ๋์์ ์ค์ ๋ฉ์์ง์ ์ด๋ฒคํธ๋ฅผ ๋ณต๊ตฌํ๋๋ก ํ์ต๋๋ค.
๋ง์น๋ฉฐ
์ค์๊ฐ ๊ธฐ๋ฅ์ด๋ผ๊ณ ํด์ ๊ผญ WebSocket์ด๋ SSE๊ฐ ์ ๋ต์ ์๋์์ต๋๋ค.
์ด๋ค ํ๋กํ ์ฝ์ด ๋ ์ค์๊ฐ์ฒ๋ผ ๋ณด์ด๋๋๋ณด๋ค, ์๋น์ค๊ฐ ์ค์ ๋ก ์๊ตฌํ๋ ์ง์ฐ ์๊ฐ๊ณผ ์ ๋ฌ ๋ณด์ฅ ์์ค์ ๋จผ์ ์ ์ํ๋ ๊ฒ ์ค์ํ์ต๋๋ค. ์ ํฌ ๋ผ์ด๋ธ ์ฑํ ์์๋ ์ํฐ์คํธ ๋ฉ์์ง์ ์ด์ ์ด๋ฒคํธ๋ฅผ ์ฐ์ ๋ณดํธํ๊ณ , ์๊ตฌ ์ ์ฅ ๋์ ์งง์ TTL์ ์ฐ๊ณ , ์ฐ๊ฒฐ ๊ด๋ฆฌ ๋์ ์์ธก ๊ฐ๋ฅํ HTTP ์์ฒญ์ ์ ํํ ์ ์์์ต๋๋ค.
๋ฌผ๋ก ์์ ํ ๋ฉ์์ง ์์ ๋ณด์ฅ์ด๋ ์์ฃผ ๋ฎ์ ์ง์ฐ, ์๋ฐฉํฅ ํต์ ์ด ํต์ฌ์ด๋ผ๋ฉด WebSocket์ด ๋ ์ ํฉํฉ๋๋ค. ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ๋น ๋ฅด๊ฒ Pushํ๋ ๊ฒ ์ค์ํ๋ค๋ฉด SSE๋ ์ถฉ๋ถํ ์ข์ ์ ํ์ด๊ณ ์. ํ์ง๋ง ์๊ตฌ์ฌํญ์ด ํ์ฉํ๋ค๋ฉด Polling์ ์ถฉ๋ถํ ๋จ์ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ๋น์ฉ ํจ์จ์ ์ธ ์ ํ์ง๊ฐ ๋ ์ ์์ต๋๋ค.
์ด๋ฒ ์์ ์์ ๊ฐ์ฅ ํฌ๊ฒ ๋ฐฐ์ด ๊ฑด, ๊ธฐ์ ์ ๊ต์ฒดํ ๋ ๊ธฐ์กด ์๋ฃจ์ ์ ๊ทธ๋๋ก ๋ฐ๋ผ ๋ง๋๋ ๊ฒ๋ณด๋ค ์ฐ๋ฆฌ ์๋น์ค๊ฐ ์ค์ ๋ก ๋ณด์ฅํด์ผ ํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ๋ค์ ๋ฌป๋ ๊ณผ์ ์ด ๋จผ์ ๋ผ๋ ์ ์ ๋๋ค.
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!