Sun Mar 29 2026
...
FastComments๊ฐ ์ฐ์ฃผ๋ฅผ ์ค๋นํ์ต๋๋ค!
! ์ด ๊ธ์๋ ๊ธฐ์ ์ ๋ฌธ ์ฉ์ด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
์๋ก์ด ์์
๊ฐ FastComments point-of-presence๋ ์ด์ ๋ก์ปฌ๋ก ์ฐ๊ธฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ด๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๋ชจ๋ ๋ค๋ฅธ ๋ ธ๋๋ก ๋ณต์ ํฉ๋๋ค. ์ด๋ ์ด์ ์์คํ ์ ๋นํด ๋ด๊ตฌ์ฑ์ด ์ฆ๊ฐํ๋ฉฐ, ์ผ๋ถ ์ง์ญ์ ์ฌ์ฉ์์๊ฒ๋ ์ค์ฌ ๋๊ตฌ๋ฅผ ๋ ๋น ๋ฅด๊ฒ ์ ๊ณตํฉ๋๋ค. ๋ค๋ง ๋ช ๊ฐ์ง ํธ๋ ์ด๋์คํ๊ฐ ์์ต๋๋ค.
โ์ฐ์ฃผ๋ฅผ ์ค๋นํ์ต๋๋คโ๋ ๋ค์ ๋๊ด์ ์ด์ง๋ง, ์ด ์์ด๋์ด๋ ์ฐ๋ฆฌ๊ฐ FastComments๋ฅผ ๋ค๋ฅธ ํ์ฑ์ ๋ฐฐํฌํ ์ ์์ผ๋ฉฐ ๊ฒฐ๊ตญ ์์คํ ์ด ๋๊ธฐํ๋๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ช ์์ฑ์ ์ฌ์ฉ์๋ค์ ์์ ์ ์ฒญ๊ตฌ์ ํ์ด์ง์์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์๋๊ธฐ๊น์ง ์ฝ ํ๋ฃจ๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ ๊ฒ์ ๋๋ค. ํ์ฌ ๊ฐ ์ง์ญ๋ง๋ค ํ๋์ ๋ง์คํฐ๋ง์ด ์ฒญ๊ตฌ ์ ๋ณด๋ฅผ ์ง๊ณํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ผ๋ถ ์ญ์ฌ, ๋ณํ์ ์ด์
FastComments๊ฐ ์ฒ์ ์ถ์๋ ๋ ์ฐ๋ฆฌ๋ ๋งค์ฐ ์ ํ์ ์ธ ์ํคํ ์ฒ๋ฅผ ๊ฐ์ถ๊ณ ์์์ต๋๋ค. ์ฐ๋ฆฌ๋ ํ๋ก์ ๊ณ์ธต, ์ฑ ๊ณ์ธต, ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์ผ๋ถ ๋ณต์ ๋ณธ, ๊ทธ๋ฆฌ๊ณ ๋์ค์๋ ์ถ๊ฐ ์ค๋ณต์ฑ์ ์ํด ์ง์ญ๊ณผ ํด๋ผ์ฐ๋ ๊ณต๊ธ์์ ๊ฑธ์ณ ๋ณต์ ๋ณธ์ ๋์์ต๋๋ค.
๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ DB ๋ณต์ ๋ณธ์ ๋๋ถ๋ถ์ ์ฌ์ฉ์๋ค์ด ์๋ ๋ชจ๋ ๊ตฌ์ญ์ผ๋ก ์ด์ ํ๊ณ , ์ฑ๋ ๊ทธ๊ณณ์ ๋ฐฐํฌํ์ผ๋ฉฐ, ์์ฒญ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฑ ๋ ธ๋๋ก ๋ผ์ฐํ ํ๊ธฐ ์ํด ์์ฒด DNS ๋ฐ ํ๋ก์ ์์คํ ์ ๋ง๋ค์์ต๋๋ค(์ด๋ ๋์ค์ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์ ์ค๋ช ๋ฉ๋๋ค). ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๊ธฐ๊ฐ ๋นจ๋ผ์ง์ง๋ง, ์ฐ๊ธฐ๋ ๋๋ ค์ง๋๋ค. ์ด์ ๋ฐฑ์๋๋ก์ ํ๋์ HTTP ์๋ณต์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ , ๊ฐ๊น์ด ๋ ธ๋๋ก์ HTTP ์๋ณต์ ๊ธฐ๋ค๋ ค์ผ ํ๊ณ , ๊ทธ ๋ ธ๋๋ ๋ค์ ๊ธฐ๋ณธ ๋ ธ๋๋ก ์ฌ๋ฌ ๋ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ธฐ๋ฅผ ํ ์ ์์ต๋๋ค. ์ข์ง ์์ต๋๋ค!
๊ทธ๋์ ์ด๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง์ ์์ญ์ ์ฌ๊ตฌ์ฑํ์ฌ ํจ์ ์ธ์์์ readPreference๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํ์ต๋๋ค. ์ด๋ฅผ ํตํด ํธ์ถ์๋ ์ฝ๊ธฐ๊ฐ ์ผ๋ง๋ ์ค๋๋ ๊ฒ์ ๋ํด ๊ด์ฐฎ์์ง๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ๊ฒ๋ค๊ฐ, ๋ ๋ง์ ์ฐ๊ธฐ ์์
(์: ์ค์ฌ์ ํ๋์ ๋ํ ํต๊ณ ๊ธฐ๋ก)์ fire-and-forget ๋ฐฉ์์ผ๋ก ๋ง๋ค์์ต๋๋ค. ์๋ฒฝํ์ง๋ ์์ง๋ง, ์๋๊ฐ ์๋นํ ๋นจ๋ผ์ก์ต๋๋ค.
Mongo๋ฅผ ์ ์ธ๊ณ์ ์ผ๋ก ์ด์ํ๋ฉด์ ๊ฒช๋ ํ ๊ฐ์ง ๋ฌธ์ ๋ ๋คํธ์ํฌ ๋ถํ ์ ๋๋ค. ์ถฉ๋ถํ ๋ ธ๋๊ฐ ๋ถ๋ฆฌ๋๋ฉด ๊ฐ ๋ ธ๋๋ ์ฝ๊ธฐ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ํ์ฉ๋๋์ง ๋ถํ์คํด์ ธ์ ์ฝ๊ธฐ๊ฐ ์ค์ง๋ฉ๋๋ค. ์ด์ ๋ํ ํด๊ฒฐ์ฑ ์ด ๋ช ๊ฐ์ง ์์ง๋ง, ์ฃ์ง ์ผ์ด์ค๋ ๋ณต์กํด์ง๋๋ค. ์ด๋ ์ด๋ก ์ ์ธ ๋ฌธ์ ๊ฐ ์๋๋๋ค - 3AM์ ํ์ด์ง๊ฐ ๋ฐ์ํ ์ ๋๋ก ์ฌ๋ฌ ๋ฒ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์ง์น๊ฒ ๋์๊ณ , MongoDB๊ฐ ๋ณต์ ์ธํธ ์ ์ถ ๋ถํ์ค์ฑ์ ๋ํด ์ต๋ 1๋ถ๊น์ง ๊ด์ฐฎ๋๋ก ์กฐ์ ํ๋ ค๊ณ ํ์ต๋๋ค. ์ํ๊น๊ฒ๋, ์๋ฅผ ๋ค์ด ์ํ์ธ๋ฃจ์์ ํ์ผ์ํ์ธ๊น์ง์ ๋คํธ์ํฌ๋ ์ฐ๋ฆฌ ํธ์คํ ์ ๊ณต์ ์ค ์ผ๋ถ์ ๋ํด ์ข์ง ์์์ต๋๋ค. ํผ์ก ์ ์ด ๋ฑ์ ์กฐ์ ํ๋ ๊ฒ์ ๋์์ด ๋์์ง๋ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ์ต๋๋ค.
๊ถ๊ทน์ ์ธ ํด๊ฒฐ์ฑ ์ ํน์ ํธ๋ ์ด๋์คํ์ ๊ด์ฐฎ๋ค๋ฉด, ํด๋น ๋ ธ๋์์ ๋ก์ปฌ๋ก ์ฐ๊ธฐ๋ฅผ ์์ฉํ๊ณ (์ํธํ ํ๋์จ์ด, RAID ๋ฑ์ ๊ฐ์ถ), ์ฌ์ฉ์์๊ฒ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์๋ค๊ณ ์๋ฆฌ๋ ๊ฒ์ ๋๋ค. ๋ํ, ํด๋น ํฌ์ธํธ-์ค๋ธ-ํ๋ ์ฆ์ค์์ ๋ด๊ตฌ์ฑ์ ์ํด ํซ ๋ณต์ ๋ณธ์ผ๋ก์ ๋ ๋ฒ์งธ ๋ ธ๋๋ฅผ ์ ์งํ ์ ์์ต๋๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ ๋๋ฌํ ๊ฒ์ ์ด๋ ์ต๋๋ค. ์ค๋ฆฌ๊ฑด, ๋ฒ์ง๋์, ํ์ผ์ํ์ธ, ์ํ์ธ๋ฃจ, ์ฑ๊ฐํฌ๋ฅด๋ ๋ชจ๋ ์์จ ๋ณต์ ์ธํธ๋ฅผ ๊ฐ์ถ๊ณ ์์ผ๋ฉฐ ์ฐ๊ธฐ๋ฅผ ์์ฉํฉ๋๋ค. EU ๋ฐฐํฌ(๋น๋ก ์ธ ๊ฐ์ PoP๋ง ์์ง๋ง)๋ ๋์ผํ ๋์์ ํฉ๋๋ค.
์๋ ๋ฐฉ์
์ผ๋ถ๋ ์ด์ ์น์ ์์ ๋ค๋ฃฌ ๋ด์ฉ์ด์ง๋ง, TL;DR๋ CRDT-lite์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ Mongo ๊ฐ์ ์์นํ์ฌ ๋ค์ค ๋ง์คํฐ๋ฅผ ๋ง๋๋ ํ๋ก์(๋ฌผ๋ก Rust๋ก) ์ ๋ง๋ค์์ต๋๋ค. ํ๋ก์๋ ํผ์ด ์ธ์, ์ฒดํฌํฌ์ธํธ ๊ด๋ฆฌ, ๋ณต์ , ๋ชจ๋ํฐ๋ง ๋ฐ ์ด๊ธฐ ๋๊ธฐํ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ Mongo์ ๋ณต์ ์์คํ ์ ์ํ ๋ค์ค ๋ง์คํฐ ๊ต์ฒด์ด๋ฉฐ, ์ผ๋ถ DDL ๋ช ๋ น์ ํฌํจํฉ๋๋ค.
๋ค๋ฅธ ๋๊ตฌ์์ ์ฐจ์ด์ ์ oplog์ tailํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. oplog์ tailํ๊ฑฐ๋ ๋ณ๊ฒฝ ์คํธ๋ฆผ์ ์ฌ์ฉํ๋ ๊ฒ์ ์๋ํ์ง ์์ผ๋ฉฐ, ์ด๋ ํด๋น ๊ฐ์ฒด์ ์ต์ข
์ํ๋ง ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ ์ถฉ๋์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๊ฐ $set, $inc ์์
์ ์บก์ฒํ๊ณ ๊ทธ ์์
์์ฒด๋ฅผ ๋ณต์ ํด์ผ ํฉ๋๋ค.
์ด๋ ๋๋ฉ์ธ ํน์ ์๋ฃจ์
์
๋๋ค. ๋ชจ๋ ์ ํ์ ์ ์ฉ๋์ง ์์ ๊ฒ์
๋๋ค. ์ด๋ฅผ ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ(domain-driven design)๋ผ๊ณ ํ ์ ์์ต๋๋ค :). ์ฐ๋ฆฌ๋ ์ฒ์๋ถํฐ ๋ฌธ์์ ํ๋๋ง $setํ์ฌ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋งค์ฐ ์ ์คํ๊ฒ ํด์์ต๋๋ค - ์๋ฅผ ๋ค์ด, Mongo์ replaceOne์ ์ ๋ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์นด์ดํฐ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ์ ๋ SET VOTES = 5๋ฅผ ํ์ง ์์ต๋๋ค. ๋์ , INCREMENT VOTES BY 5๋ผ๊ณ ์์ฑํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒฐ๊ตญ ์ผ๊ด์ฑ์ ํ์ฉํฉ๋๋ค. ๋ถ์ฐ ์ ๊ธ์ ์์ ํ ํผํจ์ผ๋ก์จ ์ฒ๋ฆฌ๋ฉ๋๋ค. ํด๋ฌ์คํฐ๋น ํ๋์ ๋
ธ๋๋ง ํฌ๋ก ์ ์คํํ๊ธฐ ์ํด ํ๋๊ทธ๊ฐ ์ค์ ๋์ด ์์ต๋๋ค. ์ด๋ ์ ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง, ์ฐ๋ฆฌ๋ ํ
๋ผ๋ฐ์ดํธ์ RAM์ ๊ฐ์ง ์๋ฒ๋ฅผ ๊ตฌ๋งคํ ์ ์์ผ๋ฏ๋ก ์ด ํธ๋ ์ด๋์คํ๋ฅผ ํตํด ์ํ๊ณผ ๋ณต์ก์ฑ์ ์ค์ผ ์ ์์ต๋๋ค.
์์ ์ ์ฐ๊ธฐ ์ฝ๊ธฐ
API๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ ์ด์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ์ ์ฐ๊ธฐ๋ฅผ ์ฝ์ ์ ์์ด์ผ ํฉ๋๋ค(๋๊ธ์ ์์ฑํ๋ API ํธ์ถ์ ํ์ฌ ๋๊ธ ๋ชฉ๋ก์ ๋์ดํ๊ณ ๊ทธ ๋ชฉ๋ก์์ ์ ํญ๋ชฉ์ ํ์ธ). ๋จ, ์ฃผ์์ฌํญ์ ์ง์ญ ๊ฐ์ ์ด ์์ ์ ์ํํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ทํ์ ๋ฐฑ์๋๊ฐ ํ๋์ ์ง์ญ(์: us-west)์์๋ง ์คํ๋๋ค๋ฉด, ์ฐ๊ธฐ์ ์ฝ๊ธฐ ์ฌ์ด์ ํด๋น ๋ ธ๋๊ฐ ๋ค์ด๋๊ฑฐ๋ DNS ์บ์๊ฐ ๋ค์ ๊ฐ๊น์ด ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์ ๋ฐ์ดํธ๋์ง ์๋ ํ ์์ ์ ์ฐ๊ธฐ๋ฅผ ์ฝ์ ์ ์์ด์ผ ํฉ๋๋ค. ์ด๋ฌํ ์ํฉ์ด ๋ฐ์ํ์ง ์์ผ๋ฉด, ์์ ์ ์ฐ๊ธฐ๋ฅผ ์ฝ๋ ๊ฒ์ ์ ๋ขฐํ ์ ์์ต๋๋ค.
ํ ์คํธ ๋ฐ ๋ง์ด๊ทธ๋ ์ด์
์์คํ ์ ์ฝ๋์ ์ฝ ์ ๋ฐ์ ํ ์คํธ ํ๋์ค, ํ๋ ์์ํฌ ๋ฐ ํ ์คํธ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ฌ์ ํ ์ถ์๊ฐ ๋ค์ ๋งค๋๋ฝ์ง ์์์ผ๋ฉฐ, ์ํ๋ ๊ฒ๋ณด๋ค ๋ ๊ธด ๋ค์ดํ์(์ ๋ฝ 1์๊ฐ, ์ ์ธ๊ณ 20๋ถ)์ด ์์๋์์ง๋ง, ์ด ์ด์ ํ๋ฅผ ํต๊ณผํ ๊ฒ์ ๊ธฐ์๊ฒ ์๊ฐํ๋ฉฐ ์ฌ๋ฌ๋ถ์ ์ธ๋ด์ ๊ฐ์ฌ๋ฅผ ๋๋ฆฝ๋๋ค!
๊ฒฐ๋ก ๋ฐ ์ฌ๋ฌ๋ถ์๊ฒ ์๋ฏธํ๋ ๋ฐ
FastComments๋ ์ด์ ๊ทธ ์ด๋ ๋๋ณด๋ค ๋น ๋ฅด๊ณ ๋ ๋ด๊ตฌ์ฑ์ด ๊ฐํด์ก์ผ๋ฉฐ, ์ด์ ๊ธฐ๋ฅ ์์ ์ผ๋ก ๋์๊ฐ ์ ์์ต๋๋ค :)
๊ฑด๋ฐฐ!
