CRDT-RPC-WASM.md
๐ก๋ ํผ๋ฐ์ค CRDT: https://crdt.tech/
RPC: https://www.techtarget.com/searchapparchitecture/definition/Remote-Procedure-Call-RPC
WASM: https://developer.mozilla.org/en-US/docs/WebAssembly
| ๋ชฉํ | ์น๊ฐ๋ฐ ๊ฐ๋ ๋ค์ ๋ํด์ ๊ฐ๋จํ ์์๋ณด์. | | -------- | --------------------------------------- | | ํ์ต๋ด์ฉ | CRDT, RPC, WASM | | ๋์ด๋ | ๐ฅ๐ฃ |
์ํฌ๋ฆฌ ๊ณต๋ถ ๐ ๊ถ๊ธํด์: CRDT, RPC, WASM
1. CRDT, Confilct-free Replicated Data Type
Conflict-free Replicated Data Type๋ ์ถฉ๋์ด ์๋ ๋ณต์ ๋ฐ์ดํฐ ํ์ ์ ์๋ฏธํฉ๋๋ค.
CRDT๋?
๋ถ์ฐ ๋ฐ์ดํฐ ์คํ ๋ฆฌ์ง ์์คํ ๊ณผ ๋ค์ค ์ฌ์ฉ์ ๊ฐ์ ๋์์ฑ๊ณผ ์ผ๊ด์ฑ์ ์ ์งํ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํ๊ณ ๋๊ธฐํํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋จ์ํํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค. CRDT๋ ๋ค์์ ๋ ธ๋๊ฐ ๋คํธ์ํฌ๋ฅผ ํตํด ํต์ ํ๊ณ ๋์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๋ถ์ฐ ํ๊ฒฝ์์ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํด ๊ฐ๋ฐ๋์์ต๋๋ค.
๋ถ์ฐ ํ๊ฒฝ์์๋ ๋คํธ์ํฌ ์ง์ฐ, ํจํท ์์ค, ๋ ธ๋ ์ฅ์ ๋ฑ์ ์ด์ ๋ก ๋ฐ์ดํฐ ๋๊ธฐํ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
| ์ ํ๋ฆฌ์ผ์ด์ ์์ | ์ค๋ช | | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- | | ๋ก์ปฌ ๋ฐ์ดํฐ | ๋ก์ปฌ ์ฅ์น์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ , ๋์ผํ ์ฌ์ฉ์์ ๋ค๋ฅธ ์ฅ์น์ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํํด์ผ ํ๋ ๊ฒฝ์ฐ ex) ์บ๋ฆฐ๋, ๋ฉ๋ชจ, ์ฐ๋ฝ์ฒ ๋๋ ์๋ฆผ ์ ํ๋ฆฌ์ผ์ด์ | | ์คํ๋ผ์ธ | ์ผ๋ถ ๋ณต์ ๋ณธ์ด ์คํ๋ผ์ธ์ธ ๊ฒฝ์ฐ์๋ ์์คํ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋๋ก ๋ฐ์ดํฐ์ ์ฌ๋ฌ ๋ณต์ ๋ณธ์ ์ ์ง ๊ด๋ฆฌํ๋ ๋ถ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฒฝ์ฐ | | ํ์ ํด | ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋์์ ๋์ผํ ํ์ผ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ํ์ ํด์ ๋ฐ์ดํฐ ๋๊ธฐํ ๋ฌธ์ ex) Google Docs, Trello, Figma ๋ฑ์ ํ์ ์ํํธ์จ์ด | | ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ | ๊ธ๋ก๋ฒ ํ์ฅ์ฑ์ ์ํด ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํ๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ์ฒ๋ฆฌ ์์คํ ์์์ ๋ฐ์ดํฐ ๋๊ธฐํ |
๋ฐ์ดํฐ ์์ ์ ์ฒ๋ฆฌํ๋ ๋ณต์ ๋ฐฉ๋ฒ
CRDT(Conflict-free Replicated Data Types)๋ ์ถฉ๋ ํด๊ฒฐ์ ์ฒ๋ฆฌํ๋ ๋๊ด์ ๋ณต์ ์์คํ ์์ ์ฌ์ฉ๋ฉ๋๋ค.ย CRDT๋ ์๋ก ๋ค๋ฅธ ๋ณต์ ๋ณธ์์ ์ด๋ค ๋ฐ์ดํฐ ์์ ์ด ์ด๋ฃจ์ด์ง๋๋ผ๋ ๋ฐ์ดํฐ๊ฐ ํญ์ ์ผ๊ด๋ ์ํ๋ก ๋ณํฉ๋ ์ ์๋๋ก ํฉ๋๋ค.ย ์ด ๋ณํฉ์ ํน๋ณํ ์ถฉ๋ ํด๊ฒฐ ์ฝ๋๋ ์ฌ์ฉ์ ๊ฐ์ ์์ด CRDT์ ์ํด ์๋์ผ๋ก ์ํ๋ฉ๋๋ค.
๋ค์์ ๊ฐ๋ ฅํ๊ฒ ์ผ๊ด๋ ๋ณต์ Strongly consistent replication์, ๋๊ด์ ๋ณต์ Optimistic replication์ ๋น๊ตํ์ ๋๋ค.
| | ๊ฐ๋ ฅํ๊ฒ ์ผ๊ด๋ ๋ณต์ | ๋๊ด์ ๋ณต์ | | ----------------------------------- | ------------------------------------------------------------------ | ------------------------------------------------------------ | | ์กฐ์ ๋ฐ ์์ ์ฌํญ | ๋ณต์ ๋ณธ์ด ์๋ก ์กฐ์ ํ์ฌ ์์ ์ฌํญ์ ๊ฒฐ์ | ์ฌ์ฉ์๊ฐ ๋ณต์ ๋ณธ์ ๋ ๋ฆฝ์ ์ผ๋ก ์์ ํ๊ณ , ์ถฉ๋์ ํต์ ์์ ํด๊ฒฐ | | ์ผ๊ด์ฑ ๋ชจ๋ธ | ์ง๋ ฌํ ๊ฐ๋ฅํ ํธ๋์ญ์ , ์ ํํ ๊ฐ๋ฅ์ฑ ๋ฑ์ ๊ฐ๋ ฅํ ์ผ๊ด์ฑ ๋ชจ๋ธ ์ง์ | ์ถฉ๋ ํด๊ฒฐ์ ํตํด ์ผ๊ด์ฑ ์ ์ง | | ์ฑ๋ฅ ์ ํ | ์กฐ์ ์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ | ์ฑ๋ฅ๊ณผ ๊ฐ์ฉ์ฑ์ ๊ทน๋ํ | | ๋คํธ์ํฌ ์ฐ๊ฒฐ ํด์ ๋์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ | ๋ณต์ ๋ณธ์ ๋คํธ์ํฌ ์ฐ๊ฒฐ ํด์ ๋์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํจ | ๋ณต์ ๋ณธ์ ๋ ๋ฆฝ์ ์ผ๋ก ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํจ | | ์ถฉ๋ ์ฒ๋ฆฌ | - | ๋ณต์ ๋ณธ ๊ฐ ์ถฉ๋์ ํต์ ์์ ํด๊ฒฐํด์ผ ํจ |
์ ๊ทผ ๋ฐฉ์๋ณ CRDT
| | ์ํ ๊ธฐ๋ฐ CRDT | ์ฐ์ฐ ๊ธฐ๋ฐ CRDT | | ----------- | -------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | | ์ ๊ทผ ๋ฐฉ์ | ๊ฐ ๋ณต์ ๋ณธ์ ์์ฒด ์ํ๋ฅผ ์ ์ง / ์ํ๋ ๋ณต์ ๋ณธ ๊ฐ์ ์ ํ | ๊ฐ ๋ณต์ ๋ณธ์ ์กฐ์์ ๋ํ ์ฐ์ฐ ๋ก๊ทธ๋ฅผ ์ ์ง / ์ฐ์ฐ ๋ก๊ทธ๋ ๋ณต์ ๋ณธ ๊ฐ์ ๊ณต์ | | ๋ก์ปฌ ์กฐ์ | ๋ก์ปฌ ์กฐ์์ ํด๋น ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ณ ๋ค๋ฅธ ๋ณต์ ๋ณธ์ ์ํ๋ฅผ ์ ํ | ๋ก์ปฌ ์กฐ์์ ์ฐ์ฐ ๋ก๊ทธ๋ก ํํ๋๋ฉฐ ์ด ๋ก๊ทธ๋ ๋ค๋ฅธ ๋ณต์ ๋ณธ๊ณผ ๊ณต์ , ๋ณํฉ | | ๋ฐ์ดํฐ ์ ํ | ๋ณํฉ ์ ์ถฉ๋ํ๋ ์ํ๋ CRDT์ ์ถฉ๋ ํด๊ฒฐ ๊ท์น์ ๋ฐ๋ผ ํด๊ฒฐ | ๋ณํฉ์๋ ๋ก๊ทธ์์ ์ฐ์ฐ์ ์ ์ฉํ๊ณ ์ถฉ๋์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ ํด๊ฒฐํ๋ ๊ณผ์ ์ด ํฌํจ | | ๋๊ธฐํ | ์ํ ์ ๋ฐ์ดํธ ์ ํ | ์ฐ์ฐ ๋ก๊ทธ ๋๊ธฐํ | | ์ฅ์ | ํ์ฌ ์ํ๋ง ๊ณต์ / ๊ตฌํ ๊ฐ๋จ, ๋คํธ์ํฌ ํธ๋ํฝ์ด ์ค์ด๋ฆ | ๋ ์ธ๋ฐํ ์ ์ด๊ฐ ๊ฐ๋ฅ / ์คํ ์ทจ์, ๋ค์ ์คํ ์์ ์ ์ง์ ํน์ ์๋๋ฆฌ์ค์์ ๊ตฌํ์ด ๋ ์ฌ์ | | ๋จ์ | ๋ณํฉ ๊ณผ์ ์์ ์ค๊ฐ ์ํ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ์ถ๊ฐ์ ์ธ ์ ์ฅ์๊ฐ ํ์ | ์ฐ์ฐ ๋ก๊ทธ ๊ณต์ ๋ก ์ธํด ๋ ๋ง์ ๋คํธ์ํฌ ํธ๋ํฝ์ด ๋ฐ์, ๋ณต์กํ ์ถฉ๋ ํด๊ฒฐ ์ ๋ต์ด ํ์ |
2. RPC, Remote Procedure Call
RPC๋?
์๊ฒฉ ํ๋ก์์ ํธ์ถ Remote Procedure Call์ ํด๋ผ์ด์ธํธ-์๋ฒ
๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ์๋ํฉ๋๋ค.
(์์ฒญ ํ๋ก๊ทธ๋จ์ ํด๋ผ์ด์ธํธ์ด๊ณ ์๋น์ค ์ ๊ณต ํ๋ก๊ทธ๋จ์ ์๋ฒ์
๋๋ค.)
๋ถ์ฐ ์ปดํจํ ํ๊ฒฝ์์ ํด๋ผ์ด์ธํธ๋ ๋ก์ปฌ ํ๋ก์์ ๋ฅผ ํธ์ถํ๋ ๊ฒ์ฒ๋ผ ์๊ฒฉ ์๋ฒ์ ์กด์ฌํ๋ ๋ค๋ฅธ ํ๋ก์์ ๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.ย ํ๋ก์์ ํธ์ถ์ ํจ์ ํธ์ถย function call **๋๋ย **์๋ธ๋ฃจํด ํธ์ถ**ย subroutine call์ด๋ผ๊ณ ๋ ํฉ๋๋ค. ๋ก์ปฌ ํ๋ก์์ ํธ์ถ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก RPC๋ย ์๊ฒฉ ํ๋ก์์ ์ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋ ๋๊น์ง ์์ฒญ ํ๋ก๊ทธ๋จ์ ์ผ์ ์ค๋จํด์ผ ํ๋ย ๋๊ธฐ ์์ ์ ๋๋ค.ย ย ๊ทธ๋ฌ๋ ๋์ผํ ์ฃผ์ ๊ณต๊ฐ์ ๊ณต์ ํ๋ ๊ฒฝ๋ ํ๋ก์ธ์ค ๋๋ย ์ค๋ ๋๋ฅผย ์ฌ์ฉํ๋ฉดย ์ฌ๋ฌ RPC๋ฅผ ๋์์ ์ํํ ์ ์์ต๋๋ค.
์ฌ์ฉ ์์
| ์ฌ์ฉ ์์ | ์ค๋ช | | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | ํด๋ผ์ด์ธํธ-์๋ฒ ํต์ | RPC๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ํต์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ. ํด๋ผ์ด์ธํธ๋ ์๊ฒฉ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ฒ์์ ์์ ์ ์คํํ๋๋ก ์์ฒญ | | ex) ๋ก๊ทธ์ธ ์ธ์ฆ ๊ฒฐ๊ณผ ์์ฒญ | | ์๊ฒฉ ์๋ฒ ํธ์ถ | ํด๋ผ์ด์ธํธ๊ฐ ์๊ฒฉ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ โ ์๋ฒ์์ ์์ ์ ์ํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ | | ex) ํน์ ์ํ์ ์ ๋ณด์์ฒญ | | ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ | ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์์ ์๋น์ค ๊ฐ ํต์ ์ ์ฌ์ฉ, ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค๋ RPC๋ฅผ ํตํด ๋ค๋ฅธ ์๋น์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๊ณ ์์ ์ ์กฐ์ | | ex) ๊ฒฐ์ ์์คํ |
3. WASM, WebAssembly
WASM์ด๋?
WASM์ "WebAssembly"์ ์ฝ์๋ก, ์น์์ ์คํ๋๋ ์ด์ง ํ์์ ํฌํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋๋ค.
์น ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ JavaScript ์ธ์ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค. WASM์ ์น ํ๋ซํผ์์ ๋์ ์ฑ๋ฅ๊ณผ ๋ณด์์ ์ ๊ณตํ๋ฉฐ, ๋ค์ํ ์ธ์ด๋ก ๊ฐ๋ฐ๋ ์์ค ์ฝ๋๋ฅผ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์คํํ ์ ์๋๋ก ํฉ๋๋ค.
WASM์ ์ฅ์
| ์ฅ์ | ์ค๋ช | | -------------- | ------------------------------------------------------------------------------------------------------------ | | ์ด์์ฑ | ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์์ฑ๋ ์ฝ๋๋ฅผ WASM์ผ๋ก ์ปดํ์ผํ์ฌ ์คํ. | | ์ฑ๋ฅ | WASM์ ํจ์จ์ ์ธ ๊ธฐ๊ณ ์ฝ๋๋ก ๋ณํ๋๋ฏ๋ก ์น์์ ๋์ ์ฑ๋ฅ์ ์ ๊ณต | | ๋ณด์ | ๊ฒฉ๋ฆฌ๋ ์คํ ํ๊ฒฝ์ ์ ๊ณตํ์ฌ ์น ๋ณด์ ์ทจ์ฝ์ ์ ์ต์ํํ๊ณ ์ ์ฑ ์ฝ๋์ ์นจํฌ๋ฅผ ๋ฐฉ์ง | | ์น ํ๋ซํผ ํตํฉ | WASM์ ์น ํ๋ซํผ์ ์ผ๋ถ๋ก ์ฑํ๋์ด ๋ชจ๋ ์ฃผ์ ์น ๋ธ๋ผ์ฐ์ ์์ ์ง์๋๋ฉฐ ๋ค์ดํฐ๋ธ ์ฝ๋์ ์คํ๊ณผ ์ํธ์์ฉ์ด ๊ฐ๋ฅ |
WASM์ ์ฌ์ฉํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋์ ์ฑ๋ฅ์ด ํ์ํ ์์ ์ ์ฒ๋ฆฌํ๊ณ , ์น์์ ๋ค๋ฅธ ์ธ์ด๋ก ์์ฑ๋ ์ฝ๋์ ์คํ์ด ๊ฐ๋ฅํด์ง๋๋ค.
์ฌ์ฉ ์์
-
WASM ๋ชจ๋ ์ปดํ์ผ
- C, C++, Rust ๋ฑ์ ์ธ์ด๋ก ์์ฑ๋ ์ฝ๋๋ฅผ WASM ํ์์ผ๋ก ์ปดํ์ผ ํฉ๋๋ค. ํด๋น ์ธ์ด์ ๋๊ตฌ ๋๋ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ WASM ๋ชจ๋ ํ์ผ(.wasm)์ ์์ฑํฉ๋๋ค.
-
JavaScript์์ WASM ๋ชจ๋ ๋ก๋
WebAssembly.instantiate()
๋๋WebAssembly.instantiateStreaming()
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ WASM ๋ชจ๋์ ๋ก๋ํฉ๋๋ค. ์ด ํจ์๋ค์ WASM ๋ชจ๋ ํ์ผ์ ๊ฐ์ ธ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๊ณ , JavaScript์์ ์ํธ์์ฉ์ ์ํ ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค.
// WASM ๋ชจ๋ ๋ก๋ fetch("example.wasm") // WASM ๋ชจ๋ ํ์ผ์ ๊ฐ์ ธ์ด .then((response) => response.arrayBuffer()) // ๋ฐฐ์ด ๋ฒํผ๋ก ๋ณํ .then((buffer) => WebAssembly.instantiate(buffer)) // WASM ๋ชจ๋ ์ธ์คํด์ค ์์ฑ .then((module) => { // WASM ๋ชจ๋ ์คํ const result = module.instance.exports.myFunction(); // WASM ๋ชจ๋์ ํจ์ ํธ์ถ console.log(result); // ๊ฒฐ๊ณผ ์ถ๋ ฅ }) .catch((error) => { console.error("Error:", error); });
- ์์ ์์์์๋
fetch()
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ WASM ๋ชจ๋ ํ์ผ์ ๊ฐ์ ธ์จ ๋ค์,arrayBuffer()
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์ด ๋ฒํผ๋ก ๋ณํํฉ๋๋ค. ๊ทธ ํ,WebAssembly.instantiate()
ํจ์๋ฅผ ํธ์ถํ์ฌ WASM ๋ชจ๋์ ๋ก๋ํ๊ณ ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก, ํด๋น ๋ชจ๋์ ํจ์๋ฅผ ํธ์ถํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ณ , ์ฝ์์ ์ถ๋ ฅํฉ๋๋ค.