์ด ๊ธ์ ๋์ค์ฝ๋ ๋ธ๋ก๊ทธ์ 'How Discord Scaled Elixir to 5,000,000 Concurrent Users?'๋ฅผ ์ฝ๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ์ ์ ์ดํด๋ฅผ ์ํด ์๋ฌธ์๋ ์๋ ์ถ๊ฐ์ ์ธ ๋ด์ฉ์ด ํฌํจ๋์ด ์์ผ๋ฉฐ, ์๋ชป ํด์ํ ๋ถ๋ถ์ด ์์ ์ ์์ต๋๋ค.
0. ๋ค์ด๊ฐ๊ธฐ์ ์์
- ๋์ค์ฝ๋๋?
- ์ค์๊ฐ ์ฑํ ์ ํ๋ฆฌ์ผ์ด์ . ์์ฑ ์ฑํ , ํ ์คํธ ์ฑํ ๋ฑ์ด ๊ฐ๋ฅ
- ๋์ ๋์์ฑ์ด ํ์ํ ์ค์๊ฐ ์์คํ โ Elixir์ Erlang VM์ ์ ํ
- Elixir์ Erlang VM์ด๋?
- Elixir(์๋ฆญ์): ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ผ์ข ์ผ๋ก, ๋์ฉ๋ ๋ถ์ฐ ์์คํ ์ ๋ง๋๋ ๋ฐ ์ ํฉํ๋ค.
- Elixir๋ ๋์์ฑ์ ์ง์ํ๋ฉฐ, ์ค๋ฅ๊ฐ ๋ฐ์ํด๋ ์์คํ ์ด ๋ฉ์ถ์ง ์๊ณ ๋์ํ๋ค.
- Java๊ฐ JVM ์์์ ์คํ๋๋ ๊ฒ์ฒ๋ผ, Elixir๋ Erlang VM ์์์ ์คํ๋๋ค.
- ๋์ค์ฝ๋๋ ์๋ฐฑ๋ง๋ช ์ด ๋์์ ์ ์ํด๋ ๋น ๋ฅด๊ฒ ๋ฉ์ธ์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์, ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ์ ์ ๊ฐ์ง Elixir๋ฅผ ์ ํํ ๊ฒ์ผ๋ก ๋ณด์
1. ๋ฉ์ธ์ง ํฌ์์(Message Fanout)
- ๋์ค์ฝ๋์์ ๋๋ถ๋ถ์ ํต์ฌ ๋ก์ง์ ๋ฐํ/๊ตฌ๋ (pub/sub) ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ๋์
- ์ฌ์ฉ์๊ฐ WebSocket์ ์ด์ฉํ์ฌ ์ฐ๊ฒฐ๋๋ฉด ์ธ์
ํ๋ก์ธ์ค๊ฐ ์์ฑ๋๋ค.
- ์ธ์ ํ๋ก์ธ์ค๋ ์๊ฒฉ Erlang ๋ ธ๋์ ํต์ ํ๋๋ฐ, ์ด ๋ ธ๋ ์์๋ GenServer๋ก ๋ง๋ค์ด์ง ๊ธธ๋ ํ๋ก์ธ์ค๊ฐ ์กด์ฌํ๋ค.
- ๊ธธ๋๋ ๋์ค์ฝ๋์์ ๋งํ๋ '์๋ฒ'๋ก, 1๋ช ์ ์ฌ์ฉ์๋ ์ฌ๋ฌ ๊ธธ๋์ ์ํ ์ ์๋ค.
- ๋์ค์ฝ๋๋ ๊ธธ๋ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํด์ ๊ฐ ๊ธธ๋๋ฅผ ๊ด๋ฆฌํ๋ค.
๐กGenServer๋?
- Elixir์ OTP(Open Telecom Platform) ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋
- Elixir์์๋ ๊ฐ ํ๋ก์ธ์ค๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๋ฉฐ ๋ฉ์ธ์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ฐ, GenServer๋ ํ๋ก์ธ์ค ์์ฑ, ๋ฉ์ธ์ง ์ฒ๋ฆฌ ๋ฑ์ ๊ตฌํ์ ๋์์ค๋ค.
- ๋ ์คํ ๋์ ์๋น ๋ก๋ด๊ณผ ๋น์ทํ ๋๋. ์๋น ๋ก๋ด์ด ์ฃผ๋ฌธ์ ๋ฐ์ ์ฃผ๋ฐฉ์ ์ ๋ฌํ๊ณ ์๋ฆฌ๊ฐ ๋์ค๋ฉด ์์์ ์๋นํด์ฃผ๋ฏ์ด, GenServer๋ Elixir์์ ๋ฐ์ดํฐ ์ ์ฅ ๋ฑ์ ์์ ์ ์ฒ๋ฆฌํด์ค๋ค.
- GenServer๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๋ช ์ด ๋์์ ์์ฒญํ์ ๋ ์์ฒญ ์์ ๋ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ฉ์ดํ๋ค.
- ์ฌ์ฉ์๋ ์จ๋ผ์ธ ์ํ๊ฐ ๋๋ฉด ๊ธธ๋์ ์ฐ๊ฒฐ๋๊ณ , ๊ธธ๋๋ ํด๋น ์ฌ์ฉ์๊ฐ ์ ์ํ์์ ์ฐ๊ฒฐ๋ ์ธ์
์ ์๋ฆฐ๋ค.
- ๋์ค์ฝ๋ ์ด๊ธฐ, 25๋ช ์ดํ์ ์๊ท๋ชจ ๊ทธ๋ฃน์ ์ํด ๊ฐ๋ฐํ ๋๋ ๋ฌธ์ ๊ฐ ์์๋ ๋ก์ง
# ์ธ์
์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ message๋ฅผ ์ ๋ฌํ๋ ํจ์
def handle_call({:publish, message}, _from, %{sessions: sessions}=state) do
Enum.each(sessions, &send(&1.pid, message))
{:reply, :ok, state}
end
- ๊ทธ๋ฌ๋ ๋์ค์ฝ๋๊ฐ ๋๊ท๋ชจ ๊ทธ๋ฃน์ ์ํ ์๋น์ค๋ก ๋ฐ์ ํ๋ฉด์ ๋ฌธ์ ๋ฐ์
/r/Overwatch
์๋ฒ์๋ ์ต๋ 3๋ง๋ช ์ ๋์ ์ ์์ ๋ฐ์- ํผํฌ ํ์์๋ ํ๋ก์ธ์ค๊ฐ ๋ฉ์ธ์ง ํ๋ฅผ ๊ฐ๋นํ์ง ๋ชปํ๊ธฐ ์์
- ์ด๋ ์๊ฐ๋ถํฐ๋ ์๋ฒ ๊ณผ๋ถํ๋ฅผ ๋ง๊ธฐ ์ํด ๋ฉ์ธ์ง๋ฅผ ์์ฑํ๋ ์ผ๋ถ ๊ธฐ๋ฅ์ ์๋์ผ๋ก ๋นํ์ฑํ
- ์๋์ผ๋ก ๊ธฐ๋ฅ์ ๋นํ์ฑํํ๋ ๊ฒ์ด ์ผ์์ ์์ ์ด ์๋ ํํ์ ์ก์ด ๋๊ธฐ ์ ์ ๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ์ฑ ์ ์ฐพ์์ผ ํ์
- ๊ธธ๋ ํ๋ก์ธ์ค ๋ด์์์ ํซ ํจ์ค(hot path, ์ฑ๋ฅ ๋ณ๋ชฉ์ด ๋ฐ์ํ๋ ํต์ฌ ์ฝ๋ ๊ฒฝ๋ก)๋ฅผ ๋ฒค์น๋งํนํ๋ฉฐ ๋ฌธ์ ์์ธ ํ์
- ๋ฌธ์ : Erlang ํ๋ก์ธ์ค ๊ฐ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ ๋น์ฉ์ด ์๊ฐ๋ณด๋ค ๋น์
- ํ๋ก์ธ์ค๊ฐ
send/2
ํจ์๋ฅผ ํธ์ถํ ๋๋ง๋ค ํด๋น ํ๋ก์ธ์ค๋ฅผ ๋นํ์ฑํ(de-scheduling)ํ๋ค๊ฐ ๋ค์ ํ์ฑํ(scheduling)ํจ- ํ๋ก์ธ์ค๋ blocked๋ ๋๋ง๋ค ๋๊ธฐ์ด์ ๋งจ ๋์ผ๋ก ๊ฐ โ ํ๋ก์ธ์ค์ ์์ ์ํ ์๋ ์ ํ
- ๊ฐ
send/2
์ ํธ์ถ ์คํ ์๊ฐ์ด 30ฮผs ~ 70ฮผs์ ๋ฌํจ - ํผํฌ ํ์์ ๋ํ ๊ธธ๋์์ ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๋ฉด, ๋ฉ์ธ์ง ํฌ์์ ๋๋ฌธ์ ์ ์ฒด ์ ์ก ์๊ฐ์ด ์ต๋ 900ms ~ 2.1์ด๊น์ง ์์
- Erlang ํ๋ก์ธ์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธ ์ค๋ ๋ โ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ํด์๋ ํ๋ก์ธ์ค๋ฅผ ์ค๋ฉ(sharding)ํด์ผ ํจ
- ํ๋ก์ธ์ค ์ค๋ฉ์ ๋ณต์กํ๋ฏ๋ก, ๋์ ๋ฉ์ธ์ง ์ ์ก ์์
์ ๋ถ์ฐํ๊ธฐ๋ก ๊ฒฐ์
- Erlang์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ ์์
์ ์ ๋ ดํ๊ธฐ ๋๋ฌธ์, ์ฒ์์๋ ๊ฐ ๋ฉ์ธ์ง ๋ฐํ์ ๊ฐ๋ณ ํ๋ก์ธ์ค๋ก ์คํํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ ค
- ๊ฐ ๋ฉ์ธ์ง ๋ฐํ์ด ์๋ก ๋ค๋ฅธ ์์ ์ ์คํ๋๋ฉด ์ด๋ฒคํธ ์์ ๋ณด์ฅ(linearizability)์ด ๊นจ์ง ์ํ์ด ์์์
- ๊ธธ๋ ์๋น์ค์ ์ ์ฒด ์์
๋๋ ์ง์์ ์ผ๋ก ์ฆ๊ฐํ๋ ์ํฉ โ ํด๋น ๋ฐฉ๋ฒ์ ํ์ฅ์ฑ์ด ๋จ์ด์ง
- ์ฌ์ฉ์๊ฐ ๋ง์์ง๋ฉด ํ๋ก์ธ์ค ๊ฐ์๋ ํจ๊ป ์ฆ๊ฐ โ ๊ด๋ฆฌ ์ด๋ ค์, CPU/๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ฆ๊ฐ
- ๊ฐ ํ๋ก์ธ์ค๊ฐ ๊ฐ๋ณ์ ์ผ๋ก ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ โ ๋คํธ์ํฌ ํธ๋ํฝ ์ฆ๊ฐ
- Erlang์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ ์์
์ ์ ๋ ดํ๊ธฐ ๋๋ฌธ์, ์ฒ์์๋ ๊ฐ ๋ฉ์ธ์ง ๋ฐํ์ ๊ฐ๋ณ ํ๋ก์ธ์ค๋ก ์คํํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ ค
- ๊ฒฐ๋ก : ๋
ธ๋ ๊ฐ ๋ฉ์ธ์ง ์ ์ก ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ธ๋ก๊ทธ ํฌ์คํ
์ ์ฐฉ์ํ์ฌ, Manifold๋ฅผ ๊ฐ๋ฐํจ
- Manifold๋ ๊ฐ์ ๋ ธ๋์ ์๋ PID๋ผ๋ฆฌ, ์ฆ ๊ฐ์ ์๋ฒ์ ์๋ ํ๋ก์ธ์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃน์ ๋ง๋ ๋ค.
- ์๋ฅผ ๋ค์ด A ๋
ธ๋์ 30๋ช
, B ๋
ธ๋์ 20๋ช
, C ๋
ธ๋์ 50๋ช
์ด ์๋ค๊ณ ๊ฐ์
- ์ด์ ์๋
send/2
ํจ์๋ฅผ 30 + 20 + 50 = 100๋ฒ ํธ์ถ - ํ์ง๋ง ์ด์ ๋ ๊ฐ ๋
ธ๋๋ณ๋ก ํ ๋ฒ์ฉ๋ง
send/2
ํจ์ ํธ์ถ โ 3๋ฒ ํธ์ถ. ๋คํธ์ํฌ ๋ถํ ๊ฐ์ - ๊ฐ ๋ ธ๋๋ค์ ์์ ์ด ๋ฐ์ ๋ฉ์ธ์ง๋ฅผ ๋ด๋ถ ํ๋ก์ธ์ค์๊ฒ ์ ์กํจ
- ๊ฐ์ ๋ ธ๋ ๋ด์์๋ ํ๋ก์ธ์ค ๊ฐ ํต์ ์ ๋คํธ์ํฌ๊ฐ ์๋ Erlang VM์ ์ด์ฉ โ ๋ฉ๋ชจ๋ฆฌ์์ ์ฒ๋ฆฌ๋ ๋ฟ ๋คํธ์ํฌ ํธ๋ํฝ ๋ฐ์ X
- ์ด์ ์๋
- ๊ฐ ๋
ธ๋์์๋
Manifold.Partitioner
๊ฐ PID๋ค์ ์ฝ์ด ์์ ๋ง๊ฒ ๋ถ๋ฐฐ- ๋ชจ๋ ๋ฉ์ธ์ง๋ฅผ ํ ํ๋ก์ธ์ค๊ฐ ์ฒ๋ฆฌํ๋ฉด, ํด๋น ํ๋ก์ธ์ค๋ง ๊ณผ๋ถํ๋จ
Manifold.Partitioner
๋ ์ฝ์ด ์์ ๋ง๊ฒ PID๋ฅผ ๋๋ ์ฃผ์ด ๊ฐ ํ๋ก์ธ์ค์ ๋ฉ์ธ์ง ์ฒ๋ฆฌ๋์ ๊ณ ๋ฅด๊ฒ ๋ถ๋ฐฐ
Manifold.send([self(), self()], :hello)
- ๋์
ํจ๊ณผ
- CPU ๋ถํ ๊ฐ์: ๋ฉ์ธ์ง ํฌ์์ ๋น์ฉ์ ์ฌ๋ฌ ํ๋ก์ธ์ค๋ก ๋ถ์ฐ
- ๋คํธ์ํฌ ํธ๋ํฝ ๊ฐ์: ๋
ธ๋ ๊ฐ ๋ถํ์ํ ๋ฐ์ดํฐ ์ ์ก ์ค์
- ๊ธฐ์กด์๋ ๊ฐ ์ ์ ์ ํ๋ก์ธ์ค(PID)๋ง๋ค
send/2
ํธ์ถ โ 100๋ช ์ ์ ์ ์๊ฒ 100๋ฒ ๋ฉ์ธ์ง ์ ์ก - Manifold ๋์ ํ์๋ ๋ ธ๋ ๋จ์๋ก ๋ฉ์ธ์ง ์ ์ก โ ์๊ฒฉ ๋ ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก 3๋ฒ ํธ์ถ
- ๊ธฐ์กด์๋ ๊ฐ ์ ์ ์ ํ๋ก์ธ์ค(PID)๋ง๋ค
- ๋์ฒด ์ฉ์ด:
send/2
ํจ์ ํธ์ถ์Manifold
๋ก ๋์ฒดํ๊ธฐ๋ง ํ๋ฉด ๋จ
2. ๊ณต์ ๋ฐ์ดํฐ์ ๋น ๋ฅด๊ฒ ์ ๊ทผํ๊ธฐ
- ๋์ค์ฝ๋๋ ์์ ํด์(Consistent Hashing)์ ์ฌ์ฉํด ์์ฒญ์ ๊ฐ ๋
ธ๋์ ๊ณ ๋ฅด๊ฒ ๋ถ๋ฐฐํ๋ ๋ถ์ฐ ์์คํ
์ ๊ตฌ์ถ
- ํด์ ๋ง ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ ธ๋๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐฉ์
- ์ด๋ฐ์๋ ๋น ๋ฅธ ์ฒ๋ฆฌ๋ฅผ ์ํด Erlang C ํฌํธ๋ฅผ ์ด์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉ
- ํ์ง๋ง ๋์ค์ฝ๋๊ฐ ํ์ฅ๋๋ฉด์ ์ฑ๋ฅ ์ด์๊ฐ ๋ฐ์ํจ
- ์ ์ ๊ฐ ๊ฐ์๊ธฐ ๋ง์ด ์ ์ํ๋ ์๊ฐ, ํด์ ๋ง์ ๊ด๋ฆฌํ๋ Erlang ํ๋ก์ธ์ค๊ฐ ๋๋ฌด ๋ฐ๋น ์ ธ์ ์์ฒญ์ ์ฒ๋ฆฌํ์ง ๋ชปํ๊ณ ์ ์ฒด ์์คํ
์ด ๋๋ ค์ง๋ ๋ฌธ์ ๋ฐ์
- ์ฒ์์ ๊ณ ์ํ ํด๊ฒฐ ๋ฐฉ๋ฒ: ์์คํ ์ฝ์ด๋ฅผ ์ด์ฉํด์ ํด์ ๋ง ๊ด๋ฆฌ ์์ ์ ์ฌ๋ฌ ํ๋ก์ธ์ค๋ก ๋๋ ์ฒ๋ฆฌํ๋ฉด ๋์ง ์์๊น?
- ํ์ง๋ง ํด๋น ๋ถ๋ถ์ hot path์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ์ถฉ๋ถํ ๊ฐ์ ๋์ง ์์์
- ๋ฌธ์ : ์ฌ์ฉ์๊ฐ ์์ ์ด ์ํ ์๋ฒ ์ ๋ณด๋ฅผ ์กฐํํ๋ ์์
์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ฆผ
- ์ฌ์ฉ์๋ ํ๊ท ์ ์ผ๋ก 5๊ฐ์ ๊ธธ๋(๋์ค์ฝ๋ ์๋ฒ)์ ์ํด ์์
- Erlang VM 1๊ฐ๋ ์ต๋ 50๋ง ๊ฐ์ ์ธ์ ์ ๊ด๋ฆฌํ ์ ์์
- ์ธ์ ์ด ์ฐ๊ฒฐ๋ ๋๋ง๋ค ์ฌ์ฉ์๊ฐ ์ํ ๋ชจ๋ ๊ธธ๋์ ์๊ฒฉ ๋ ธ๋๋ฅผ ์กฐํํด์ผ ํจ
- ์ฌ์ฉ์๊ฐ ์ํ ๊ธธ๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์๋ ์๊ฒฉ ๋ ธ๋๋ฅผ ์ฐพ๋ ์์ ์ ์ต๋ 50๋ง๊ฐ์ ์ธ์ ์ด ๋์์ ์งํํ๋ฉด ๋ถํ๊ฐ ๊ธ์ฆ
- Erlang ํ๋ก์ธ์ค ๊ฐ ์ปค๋ฎค๋์ผ์ด์ ๋น์ฉ์ 12ฮผs
- ์ธ์ ์ด ์ฌ์์๋๋ฉด ํด์ ๋ง์ ์กฐํํ๋ ๋ฐ๋ง 30์ด๊ฐ ์์๋จ
- ์ฒซ ๋ฒ์งธ ํด๊ฒฐ ๋ฐฉ๋ฒ: ETS ์ฌ์ฉํ๊ธฐ
- ETS(Erlang Term Storage): C๋ก ๊ตฌํ๋ ๋น ๋ฅด๊ณ ์์ ๊ฐ๋ฅํ ๋์ ๋๋ฆฌ
- ๋ฌธ์ ์ : ETS์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋๋ง๋ค ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํด์ผ ํจ โ ์ฑ๋ฅ ๊ฐ์ ๋ฏธ๋ฏธ
- ํด์ ๋ง ์๋ฃ๊ตฌ์กฐ๊ฐ ๊ฝค ์ปค์ ETS์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ ๋น์ฉ์ด ์ปธ์
- ETS์์์ ์กฐํ ์๋๋ ์ฝ 7ฮผs์์ง๋ง, ํด์ ๋ง ์กฐํ์๋ ์ฌ์ ํ 17.5์ด ์์ โ ์ฑ๋ฅ์ด ์ถฉ๋ถํ ๊ฐ์ ๋์ง ์์
- ๋ ๋ฒ์งธ ํด๊ฒฐ ๋ฐฉ๋ฒ: mochiglobal ๋ชจ๋ ์ฌ์ฉํ๊ธฐ
- mochiglobal์ Erlang VM์ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ read-pnly shared heap์ ์ ์ฅํด์ค
- mochiglobal์ ์ฌ์ฉํ๋ฉด ํ๋ก์ธ์ค๋ค์ ๋ฐ์ดํฐ ๋ณต์ฌ ์์ด๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์์
- mochiglobal์ ๋ฐ์ดํฐ๋ฅผ ๋ณ์๊ฐ ์๋๋ผ ํจ์๋ก ๋ง๋ค์ด์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ
- ๋ฐ์ดํฐ ํ์ ๋น์ฉ์ 0.3ฮผs๋ก ์ ๊ฐ โ ์ ์ฒด ์กฐํ ์๊ฐ์ด 750ms๋ก ๋จ์ถ๋จ
- ๋จ์ : ์๋ฃ๊ตฌ์กฐ๊ฐ ๋๋ฌด ํฌ๋ฉด ํด๋น ํจ์๋ฅผ ๊ฐ๋ Erlang ๋ชจ๋์ ์์ฑํ๋ ๋ฐ ์ต๋ 1์ด ์์
- ํด์ ๋ง์ ์์ฃผ ์์ ํ์ง๋ ์๊ธฐ์ ๊ฐ๋น ๊ฐ๋ฅํ ๋จ์ ์ด์์
- mochiglobal์ Elixir๋ก ํฌํ
ํ๊ณ ,
atom
์ด ์์ฑ๋์ง ์๋๋ก ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ FastGlobal ๊ฐ๋ฐ- mochiglobal์ Erlang์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ ๊ธฐ์ ์ด์๊ธฐ์, Elixir์์ ์ฌ์ฉํ๋ ค๋ฉด ํฌํ ์ด ํ์ํ์
- ์ํฐ์ด๋?
- Erlang๊ณผ Elixir์์ ์ฌ์ฉํ๋ ํน์ํ ํ์ ์ผ๋ก, ์ผ์ข ์ ๊ณ ์ ๋ ์ด๋ฆ์ ๊ฐ์ง ๊ฐ
:ok
,:error
,:start
๋ฑ
- ์ํฐ์ ํ๋ฒ ์์ฑ๋๋ฉด ์ ๋ ์ญ์ ๋์ง ์๊ธฐ ๋๋ฌธ์, ๋๋ฌด ๋ง์ด ๋ง๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ค ์ฐจ์ ํ๋ก๊ทธ๋จ์ด ์ฃฝ์ด๋ฒ๋ฆผ
3. ์ ํ๋ ๋์์ฑ (Limited Concurrency)
- ๋ ธ๋ ์กฐํ(lookup)์์ ๋ฐ์ํ๋ hot path ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ค, ๊ฐ ๊ธธ๋ ๋ ธ๋์ PID๋ฅผ ์ฐพ๋ ํ๋ก์ธ์ค๋ค์ด ์ง์ฐ๋๊ณ ์์์ ๋ฐ๊ฒฌํจ
- ์ด์ ์๋ ๊ธธ๋ ๋ ธ๋๋ฅผ ์ฐพ๋ ์๋๊ฐ ๋๋ ค์ ์์ฒญ์ด ์ฒ์ฒํ ๋ค์ด์์ง๋ง, ๋ ธ๋ ์กฐํ ์๋๊ฐ ๋นจ๋ผ์ง๋ฉด์ ๋ฌธ์ ๊ฐ ๋๋ฌ๋ ๊ฒ
- ์๋ก์ด ๋ฌธ์ : ์ฝ 500๋ง ๊ฐ์ ์ธ์
ํ๋ก์ธ์ค๊ฐ ํ๊บผ๋ฒ์ 10๊ฐ์ ๊ธธ๋ ์กฐํ ํ๋ก์ธ์ค์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์์ํจ
- ๊ธธ๋ ์กฐํ ํ๋ก์ธ์ค๋ ๊ธธ๋ ๋ ธ๋ ๋น 1๊ฐ์ฉ ์กด์ฌ
- ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ์์ธ
- ์ธ์ ํ๋ก์ธ์ค๊ฐ ๊ธธ๋ ๋ ์ง์คํธ๋ฆฌ์ ์์ฒญ์ ๋ณด๋
- ๊ธธ๋ ๋ ์ง์คํธ๋ฆฌ๋ ๋ฐ๋น ์ ์ ๋ ์๋ตํ์ง ๋ชปํ๊ณ , ์์ฒญ์ ๋ณด๋ธ ์ธ์ ํ๋ก์ธ์ค๋ timeout๋จ
- ์ธ์ ํ๋ก์ธ์ค๋ backoff ํ ์์ฒญ์ ๋ค์ ๋ณด๋ด์ง๋ง, ์์ฒญ์ด ์ง์์ ์ผ๋ก ๊ธธ๋ ๋ ์ง์คํธ๋ฆฌ์ ํ์ ์์ฌ ๋ณต๊ตฌํ ์ ์๋ ์ํ๊ฐ ๋จ
- ์ธ์ ํ๋ก์ธ์ค๋ ๊ธธ๋ ๋ ์ง์คํธ๋ฆฌ์ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ฉฐ block๋๋ฏ๋ก ๋ค๋ฅธ ์๋น์ค๋ก๋ถํฐ ์จ ๋ฉ์ธ์ง๋ ์ฒ๋ฆฌํ ์ ์์
- ์ธ์ ํ๋ก์ธ์ค์ ๋ฉ์ธ์ง ํ๊ฐ ์ ์ ์ปค์ ธ์ ๊ฒฐ๊ตญ Erlang VM ์ ์ฒด๊ฐ Out Of Memory๋ก ๋ค์ด๋จ โ ์ฐ์์ ์ธ ์๋น์ค ์ฅ์ ๊ฐ ๋ฐ์
- ์ด์์ ์ธ ํด๊ฒฐ์ฑ
- ์์ฒญ ์คํจ๊ฐ ๋ถ๊ฐํผํ ๊ฒฝ์ฐ, ๊ธธ๋ ๋ ์ง์คํธ๋ฆฌ์ ์์ ์์ฒญ์ ๋ณด๋ด์ง ์๋๋ก ํ๋ก์ธ์ค๋ฅผ ๋ ๋๋ํ๊ฒ ๋ง๋ค๊ธฐ
- ์ํท ๋ธ๋ ์ด์ปค๋ฅผ ์ฌ์ฉํ ์๋ ์์์ง๋ง, ๋์ค์ฝ๋ ํ์ ์ํท ๋ธ๋ ์ด์ปค๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ง ์์์
- timeout ๋ฐ์์ด ๊ธ์ฆํ๋ ๊ฒฝ์ฐ, ์ผ์ ์๊ฐ ๋์ ๋ชจ๋ ์์ฒญ์ด ์ฐจ๋จ๋๋ ์ํ๋ฅผ ์์น ์์๊ธฐ ๋๋ฌธ
- ๋ค๋ฅธ ์ธ์ด์์๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ์๊ณ ์์์ง๋ง, Elixir์์๋ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ์์๋ด์ผ ํ์
- ๋ค๋ฅธ ์ธ์ด์์๋ atomic ์นด์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ ์์ฒญ ์๋ฅผ ์ถ์ ํ๋ ๋ฐฉ์์ ์ด์ฉ
- ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ ์์ฒญ ์๊ฐ ๋๋ฌด ๋ง์ผ๋ฉด ๋ฏธ๋ฆฌ ์์ฒญ์ ์ทจ์ํ๋ ๋ฐฉ์์ผ๋ก semaphore๋ฅผ ๊ตฌํํ์
- ๋ณดํต semaphore๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ
- ํ์ง๋ง Elrang VM์ ํ๋ก์ธ์ค ๊ฐ ํต์ ์ ์ค์ฌ์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์, ํ์ฌ ์งํ์ค์ธ ์์ฒญ ๊ฐ์๋ฅผ ๊ณต์ ํ๊ธฐ ์ํด ๋ณ๋์ ๋ฉ์ธ์ง ํต์ ์ด ํ์ํ์
- Elrang VM์์๋ ํ๋ก์ธ์ค ๊ฐ ๋ฉ์ธ์ง ํต์ ์ ๊ธฐ๋ฐ์ผ๋ก ์ธ๋งํฌ์ด๋ฅผ ๊ตฌํํ ์ ์์์ง๋ง, ๋์ค์ฝ๋ ํ์ ์์ฒญ ๊ฐ์ ์กฐ์ ์ ์ํด ํ๋ก์ธ์ค๋ฅผ ๊ณผ๋ถํ์ํค๊ณ ์ถ์ง ์์์
- ๊ฐ ํ๋ก์ธ์ค๋ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๋ฏ๋ก, ์๋ก ๊ณต์ ํ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๊ณ ๋ชจ๋ ๋ฐ์ดํฐ๋ ๋ฉ์ธ์ง๋ฅผ ํตํด ์ ๋ฌ๋จ
- ๋ฐ๋ผ์ Elrang VM์์ ์ธ๋งํฌ์ด๋ฅผ ๊ตฌํํ๋ ค๋ฉด ์งํ์ค์ธ ์์ฒญ ๊ฐ์๋ฅผ ํ์ธํ๋ ์์ ์ ๋ด๋นํ๋ ํ๋ก์ธ์ค๊ฐ ํ์ํจ
- ์ด ์์ ์ ํ๋์ ํ๋ก์ธ์ค๊ฐ ๋ด๋นํ๋ฉด ๋๋ฌด ๋ง์ ์์ฒญ์ด ๋ชฐ๋ ค ํด๋น ํ๋ก์ธ์ค๊ฐ ๊ณผ๋ถํ๋ ์ ์์
- ์ธ์ ํ๋ก์ธ์ค๋ ์๋ฐฑ๋ง ๊ฐ๊ฐ ์กด์ฌํ๊ณ , ์ธ์ ํ๋ก์ธ์ค๊ฐ ๊ธธ๋ ์ ๋ณด๋ฅผ ์์ฒญํ ๋๋ง๋ค 'ํ์ฌ ์งํ์ค์ธ ์์ฒญ ๊ฐ์'๋ฅผ ํ์ธํด์ผ ํ๊ธฐ ๋๋ฌธ
- ๋์ค์ฝ๋ ํ์ ์ค์ ํ๋ก์ธ์ค ๋์ , ETS๊ฐ์ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์์ฒญ ๊ฐ์๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ํ
:ets.update_counter/4
๊ธฐ๋ฅ ์ด์ฉ- ํด๋น ๊ธฐ๋ฅ์ ETS ๋ด์ ๊ฐ์ ์์์ ์ผ๋ก ์ฆ๊ฐ์ํค๋ ์ฐ์ฐ์ ์ํํ๋ ๋์์ ํ์ฌ ๊ฐ์ ๋ฐํํจ
- ์ถ๊ฐ์ ์ธ ์ฝ๊ธฐ ์ฐ์ฐ ์์ด ์นด์ดํฐ ๊ฐ์ ๋ฐ๋ก ํ์ธํ ์ ์์ด ๋ค์ค ํ๋ก์ธ์ค ํ๊ฒฝ์์๋ ์์ ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์
- ๋ํ ETS๋ฅผ
write_concurrency
๋ชจ๋๋ก ์คํํ์ฌ ๋์ ๋์์ฑ์ ํ๋ณด โ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ํ๋์ ๋ฐ์ดํฐ์ ๋์ ์ ๊ทผํด๋ ๋ด๋ถ์ ์ผ๋ก ์ต์ ํ๋์ด ๋ณ๋ ฌ ์ฒ๋ฆฌ ๊ฐ๋ฅ
- ์ ๋ฐฉ๋ฒ์ ๊ธฐ๋ฐ์ผ๋ก ์ธ๋งํฌ์ด(semaphore) ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์
- ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๊ณ , ๋์ ์ฒ๋ฆฌ๋ ํ๊ฒฝ์์๋ ๋ฐ์ด๋ ์ฑ๋ฅ์ ๋ฐํํจ
- ์ฐ์์ ์ธ ์ฅ์ ๋ก๋ถํฐ ๋์ค์ฝ๋์ Elixir ์ธํ๋ผ๋ฅผ ๋ณดํธํด์ค
- ์ค์ ๋ก ์ ์ ์ํ ๊ด๋ฆฌ ์๋น์ค๊ฐ ๊ด๋ จ์๋ ์ด์๋ก ์ธํด ์ค๋จ๋์์ง๋ง, ์ธ์ ์๋น์ค๋ ์ํฅ์ ๋ฐ์ง ์์์ผ๋ฉฐ ์ ์ ์ํ ๊ด๋ฆฌ ์๋น์ค๋ ๋ช ๋ถ ๋ด๋ก ์ฌ์์๋จ
semaphore_name = :my_semaphore
semaphore_max = 10
case Semaphore.call(semaphore_name, semaphore_max, fn -> :ok end) do
:ok ->
IO.puts "success"
{:error, :max} ->
IO.puts "too many callers"
end
'๐๐ญ๐ฎ๐๐ฒ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring ๊ด๋ จ CS ์ง๋ฌธ ์ ๋ฆฌ (1) | 2023.11.02 |
---|
์ด ๊ธ์ ๋์ค์ฝ๋ ๋ธ๋ก๊ทธ์ 'How Discord Scaled Elixir to 5,000,000 Concurrent Users?'๋ฅผ ์ฝ๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ์ ์ ์ดํด๋ฅผ ์ํด ์๋ฌธ์๋ ์๋ ์ถ๊ฐ์ ์ธ ๋ด์ฉ์ด ํฌํจ๋์ด ์์ผ๋ฉฐ, ์๋ชป ํด์ํ ๋ถ๋ถ์ด ์์ ์ ์์ต๋๋ค.
0. ๋ค์ด๊ฐ๊ธฐ์ ์์
- ๋์ค์ฝ๋๋?
- ์ค์๊ฐ ์ฑํ ์ ํ๋ฆฌ์ผ์ด์ . ์์ฑ ์ฑํ , ํ ์คํธ ์ฑํ ๋ฑ์ด ๊ฐ๋ฅ
- ๋์ ๋์์ฑ์ด ํ์ํ ์ค์๊ฐ ์์คํ โ Elixir์ Erlang VM์ ์ ํ
- Elixir์ Erlang VM์ด๋?
- Elixir(์๋ฆญ์): ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ผ์ข ์ผ๋ก, ๋์ฉ๋ ๋ถ์ฐ ์์คํ ์ ๋ง๋๋ ๋ฐ ์ ํฉํ๋ค.
- Elixir๋ ๋์์ฑ์ ์ง์ํ๋ฉฐ, ์ค๋ฅ๊ฐ ๋ฐ์ํด๋ ์์คํ ์ด ๋ฉ์ถ์ง ์๊ณ ๋์ํ๋ค.
- Java๊ฐ JVM ์์์ ์คํ๋๋ ๊ฒ์ฒ๋ผ, Elixir๋ Erlang VM ์์์ ์คํ๋๋ค.
- ๋์ค์ฝ๋๋ ์๋ฐฑ๋ง๋ช ์ด ๋์์ ์ ์ํด๋ ๋น ๋ฅด๊ฒ ๋ฉ์ธ์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์, ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ์ ์ ๊ฐ์ง Elixir๋ฅผ ์ ํํ ๊ฒ์ผ๋ก ๋ณด์
1. ๋ฉ์ธ์ง ํฌ์์(Message Fanout)
- ๋์ค์ฝ๋์์ ๋๋ถ๋ถ์ ํต์ฌ ๋ก์ง์ ๋ฐํ/๊ตฌ๋ (pub/sub) ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ๋์
- ์ฌ์ฉ์๊ฐ WebSocket์ ์ด์ฉํ์ฌ ์ฐ๊ฒฐ๋๋ฉด ์ธ์
ํ๋ก์ธ์ค๊ฐ ์์ฑ๋๋ค.
- ์ธ์ ํ๋ก์ธ์ค๋ ์๊ฒฉ Erlang ๋ ธ๋์ ํต์ ํ๋๋ฐ, ์ด ๋ ธ๋ ์์๋ GenServer๋ก ๋ง๋ค์ด์ง ๊ธธ๋ ํ๋ก์ธ์ค๊ฐ ์กด์ฌํ๋ค.
- ๊ธธ๋๋ ๋์ค์ฝ๋์์ ๋งํ๋ '์๋ฒ'๋ก, 1๋ช ์ ์ฌ์ฉ์๋ ์ฌ๋ฌ ๊ธธ๋์ ์ํ ์ ์๋ค.
- ๋์ค์ฝ๋๋ ๊ธธ๋ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํด์ ๊ฐ ๊ธธ๋๋ฅผ ๊ด๋ฆฌํ๋ค.
๐กGenServer๋?
- Elixir์ OTP(Open Telecom Platform) ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋
- Elixir์์๋ ๊ฐ ํ๋ก์ธ์ค๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๋ฉฐ ๋ฉ์ธ์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ฐ, GenServer๋ ํ๋ก์ธ์ค ์์ฑ, ๋ฉ์ธ์ง ์ฒ๋ฆฌ ๋ฑ์ ๊ตฌํ์ ๋์์ค๋ค.
- ๋ ์คํ ๋์ ์๋น ๋ก๋ด๊ณผ ๋น์ทํ ๋๋. ์๋น ๋ก๋ด์ด ์ฃผ๋ฌธ์ ๋ฐ์ ์ฃผ๋ฐฉ์ ์ ๋ฌํ๊ณ ์๋ฆฌ๊ฐ ๋์ค๋ฉด ์์์ ์๋นํด์ฃผ๋ฏ์ด, GenServer๋ Elixir์์ ๋ฐ์ดํฐ ์ ์ฅ ๋ฑ์ ์์ ์ ์ฒ๋ฆฌํด์ค๋ค.
- GenServer๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๋ช ์ด ๋์์ ์์ฒญํ์ ๋ ์์ฒญ ์์ ๋ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ฉ์ดํ๋ค.
- ์ฌ์ฉ์๋ ์จ๋ผ์ธ ์ํ๊ฐ ๋๋ฉด ๊ธธ๋์ ์ฐ๊ฒฐ๋๊ณ , ๊ธธ๋๋ ํด๋น ์ฌ์ฉ์๊ฐ ์ ์ํ์์ ์ฐ๊ฒฐ๋ ์ธ์
์ ์๋ฆฐ๋ค.
- ๋์ค์ฝ๋ ์ด๊ธฐ, 25๋ช ์ดํ์ ์๊ท๋ชจ ๊ทธ๋ฃน์ ์ํด ๊ฐ๋ฐํ ๋๋ ๋ฌธ์ ๊ฐ ์์๋ ๋ก์ง
# ์ธ์
์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ message๋ฅผ ์ ๋ฌํ๋ ํจ์
def handle_call({:publish, message}, _from, %{sessions: sessions}=state) do
Enum.each(sessions, &send(&1.pid, message))
{:reply, :ok, state}
end
- ๊ทธ๋ฌ๋ ๋์ค์ฝ๋๊ฐ ๋๊ท๋ชจ ๊ทธ๋ฃน์ ์ํ ์๋น์ค๋ก ๋ฐ์ ํ๋ฉด์ ๋ฌธ์ ๋ฐ์
/r/Overwatch
์๋ฒ์๋ ์ต๋ 3๋ง๋ช ์ ๋์ ์ ์์ ๋ฐ์- ํผํฌ ํ์์๋ ํ๋ก์ธ์ค๊ฐ ๋ฉ์ธ์ง ํ๋ฅผ ๊ฐ๋นํ์ง ๋ชปํ๊ธฐ ์์
- ์ด๋ ์๊ฐ๋ถํฐ๋ ์๋ฒ ๊ณผ๋ถํ๋ฅผ ๋ง๊ธฐ ์ํด ๋ฉ์ธ์ง๋ฅผ ์์ฑํ๋ ์ผ๋ถ ๊ธฐ๋ฅ์ ์๋์ผ๋ก ๋นํ์ฑํ
- ์๋์ผ๋ก ๊ธฐ๋ฅ์ ๋นํ์ฑํํ๋ ๊ฒ์ด ์ผ์์ ์์ ์ด ์๋ ํํ์ ์ก์ด ๋๊ธฐ ์ ์ ๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ์ฑ ์ ์ฐพ์์ผ ํ์
- ๊ธธ๋ ํ๋ก์ธ์ค ๋ด์์์ ํซ ํจ์ค(hot path, ์ฑ๋ฅ ๋ณ๋ชฉ์ด ๋ฐ์ํ๋ ํต์ฌ ์ฝ๋ ๊ฒฝ๋ก)๋ฅผ ๋ฒค์น๋งํนํ๋ฉฐ ๋ฌธ์ ์์ธ ํ์
- ๋ฌธ์ : Erlang ํ๋ก์ธ์ค ๊ฐ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ ๋น์ฉ์ด ์๊ฐ๋ณด๋ค ๋น์
- ํ๋ก์ธ์ค๊ฐ
send/2
ํจ์๋ฅผ ํธ์ถํ ๋๋ง๋ค ํด๋น ํ๋ก์ธ์ค๋ฅผ ๋นํ์ฑํ(de-scheduling)ํ๋ค๊ฐ ๋ค์ ํ์ฑํ(scheduling)ํจ- ํ๋ก์ธ์ค๋ blocked๋ ๋๋ง๋ค ๋๊ธฐ์ด์ ๋งจ ๋์ผ๋ก ๊ฐ โ ํ๋ก์ธ์ค์ ์์ ์ํ ์๋ ์ ํ
- ๊ฐ
send/2
์ ํธ์ถ ์คํ ์๊ฐ์ด 30ฮผs ~ 70ฮผs์ ๋ฌํจ - ํผํฌ ํ์์ ๋ํ ๊ธธ๋์์ ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๋ฉด, ๋ฉ์ธ์ง ํฌ์์ ๋๋ฌธ์ ์ ์ฒด ์ ์ก ์๊ฐ์ด ์ต๋ 900ms ~ 2.1์ด๊น์ง ์์
- Erlang ํ๋ก์ธ์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธ ์ค๋ ๋ โ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ํด์๋ ํ๋ก์ธ์ค๋ฅผ ์ค๋ฉ(sharding)ํด์ผ ํจ
- ํ๋ก์ธ์ค ์ค๋ฉ์ ๋ณต์กํ๋ฏ๋ก, ๋์ ๋ฉ์ธ์ง ์ ์ก ์์
์ ๋ถ์ฐํ๊ธฐ๋ก ๊ฒฐ์
- Erlang์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ ์์
์ ์ ๋ ดํ๊ธฐ ๋๋ฌธ์, ์ฒ์์๋ ๊ฐ ๋ฉ์ธ์ง ๋ฐํ์ ๊ฐ๋ณ ํ๋ก์ธ์ค๋ก ์คํํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ ค
- ๊ฐ ๋ฉ์ธ์ง ๋ฐํ์ด ์๋ก ๋ค๋ฅธ ์์ ์ ์คํ๋๋ฉด ์ด๋ฒคํธ ์์ ๋ณด์ฅ(linearizability)์ด ๊นจ์ง ์ํ์ด ์์์
- ๊ธธ๋ ์๋น์ค์ ์ ์ฒด ์์
๋๋ ์ง์์ ์ผ๋ก ์ฆ๊ฐํ๋ ์ํฉ โ ํด๋น ๋ฐฉ๋ฒ์ ํ์ฅ์ฑ์ด ๋จ์ด์ง
- ์ฌ์ฉ์๊ฐ ๋ง์์ง๋ฉด ํ๋ก์ธ์ค ๊ฐ์๋ ํจ๊ป ์ฆ๊ฐ โ ๊ด๋ฆฌ ์ด๋ ค์, CPU/๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ฆ๊ฐ
- ๊ฐ ํ๋ก์ธ์ค๊ฐ ๊ฐ๋ณ์ ์ผ๋ก ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ โ ๋คํธ์ํฌ ํธ๋ํฝ ์ฆ๊ฐ
- Erlang์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ ์์
์ ์ ๋ ดํ๊ธฐ ๋๋ฌธ์, ์ฒ์์๋ ๊ฐ ๋ฉ์ธ์ง ๋ฐํ์ ๊ฐ๋ณ ํ๋ก์ธ์ค๋ก ์คํํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ ค
- ๊ฒฐ๋ก : ๋
ธ๋ ๊ฐ ๋ฉ์ธ์ง ์ ์ก ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ธ๋ก๊ทธ ํฌ์คํ
์ ์ฐฉ์ํ์ฌ, Manifold๋ฅผ ๊ฐ๋ฐํจ
- Manifold๋ ๊ฐ์ ๋ ธ๋์ ์๋ PID๋ผ๋ฆฌ, ์ฆ ๊ฐ์ ์๋ฒ์ ์๋ ํ๋ก์ธ์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃน์ ๋ง๋ ๋ค.
- ์๋ฅผ ๋ค์ด A ๋
ธ๋์ 30๋ช
, B ๋
ธ๋์ 20๋ช
, C ๋
ธ๋์ 50๋ช
์ด ์๋ค๊ณ ๊ฐ์
- ์ด์ ์๋
send/2
ํจ์๋ฅผ 30 + 20 + 50 = 100๋ฒ ํธ์ถ - ํ์ง๋ง ์ด์ ๋ ๊ฐ ๋
ธ๋๋ณ๋ก ํ ๋ฒ์ฉ๋ง
send/2
ํจ์ ํธ์ถ โ 3๋ฒ ํธ์ถ. ๋คํธ์ํฌ ๋ถํ ๊ฐ์ - ๊ฐ ๋ ธ๋๋ค์ ์์ ์ด ๋ฐ์ ๋ฉ์ธ์ง๋ฅผ ๋ด๋ถ ํ๋ก์ธ์ค์๊ฒ ์ ์กํจ
- ๊ฐ์ ๋ ธ๋ ๋ด์์๋ ํ๋ก์ธ์ค ๊ฐ ํต์ ์ ๋คํธ์ํฌ๊ฐ ์๋ Erlang VM์ ์ด์ฉ โ ๋ฉ๋ชจ๋ฆฌ์์ ์ฒ๋ฆฌ๋ ๋ฟ ๋คํธ์ํฌ ํธ๋ํฝ ๋ฐ์ X
- ์ด์ ์๋
- ๊ฐ ๋
ธ๋์์๋
Manifold.Partitioner
๊ฐ PID๋ค์ ์ฝ์ด ์์ ๋ง๊ฒ ๋ถ๋ฐฐ- ๋ชจ๋ ๋ฉ์ธ์ง๋ฅผ ํ ํ๋ก์ธ์ค๊ฐ ์ฒ๋ฆฌํ๋ฉด, ํด๋น ํ๋ก์ธ์ค๋ง ๊ณผ๋ถํ๋จ
Manifold.Partitioner
๋ ์ฝ์ด ์์ ๋ง๊ฒ PID๋ฅผ ๋๋ ์ฃผ์ด ๊ฐ ํ๋ก์ธ์ค์ ๋ฉ์ธ์ง ์ฒ๋ฆฌ๋์ ๊ณ ๋ฅด๊ฒ ๋ถ๋ฐฐ
Manifold.send([self(), self()], :hello)
- ๋์
ํจ๊ณผ
- CPU ๋ถํ ๊ฐ์: ๋ฉ์ธ์ง ํฌ์์ ๋น์ฉ์ ์ฌ๋ฌ ํ๋ก์ธ์ค๋ก ๋ถ์ฐ
- ๋คํธ์ํฌ ํธ๋ํฝ ๊ฐ์: ๋
ธ๋ ๊ฐ ๋ถํ์ํ ๋ฐ์ดํฐ ์ ์ก ์ค์
- ๊ธฐ์กด์๋ ๊ฐ ์ ์ ์ ํ๋ก์ธ์ค(PID)๋ง๋ค
send/2
ํธ์ถ โ 100๋ช ์ ์ ์ ์๊ฒ 100๋ฒ ๋ฉ์ธ์ง ์ ์ก - Manifold ๋์ ํ์๋ ๋ ธ๋ ๋จ์๋ก ๋ฉ์ธ์ง ์ ์ก โ ์๊ฒฉ ๋ ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก 3๋ฒ ํธ์ถ
- ๊ธฐ์กด์๋ ๊ฐ ์ ์ ์ ํ๋ก์ธ์ค(PID)๋ง๋ค
- ๋์ฒด ์ฉ์ด:
send/2
ํจ์ ํธ์ถ์Manifold
๋ก ๋์ฒดํ๊ธฐ๋ง ํ๋ฉด ๋จ
2. ๊ณต์ ๋ฐ์ดํฐ์ ๋น ๋ฅด๊ฒ ์ ๊ทผํ๊ธฐ
- ๋์ค์ฝ๋๋ ์์ ํด์(Consistent Hashing)์ ์ฌ์ฉํด ์์ฒญ์ ๊ฐ ๋
ธ๋์ ๊ณ ๋ฅด๊ฒ ๋ถ๋ฐฐํ๋ ๋ถ์ฐ ์์คํ
์ ๊ตฌ์ถ
- ํด์ ๋ง ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ ธ๋๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐฉ์
- ์ด๋ฐ์๋ ๋น ๋ฅธ ์ฒ๋ฆฌ๋ฅผ ์ํด Erlang C ํฌํธ๋ฅผ ์ด์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉ
- ํ์ง๋ง ๋์ค์ฝ๋๊ฐ ํ์ฅ๋๋ฉด์ ์ฑ๋ฅ ์ด์๊ฐ ๋ฐ์ํจ
- ์ ์ ๊ฐ ๊ฐ์๊ธฐ ๋ง์ด ์ ์ํ๋ ์๊ฐ, ํด์ ๋ง์ ๊ด๋ฆฌํ๋ Erlang ํ๋ก์ธ์ค๊ฐ ๋๋ฌด ๋ฐ๋น ์ ธ์ ์์ฒญ์ ์ฒ๋ฆฌํ์ง ๋ชปํ๊ณ ์ ์ฒด ์์คํ
์ด ๋๋ ค์ง๋ ๋ฌธ์ ๋ฐ์
- ์ฒ์์ ๊ณ ์ํ ํด๊ฒฐ ๋ฐฉ๋ฒ: ์์คํ ์ฝ์ด๋ฅผ ์ด์ฉํด์ ํด์ ๋ง ๊ด๋ฆฌ ์์ ์ ์ฌ๋ฌ ํ๋ก์ธ์ค๋ก ๋๋ ์ฒ๋ฆฌํ๋ฉด ๋์ง ์์๊น?
- ํ์ง๋ง ํด๋น ๋ถ๋ถ์ hot path์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ์ถฉ๋ถํ ๊ฐ์ ๋์ง ์์์
- ๋ฌธ์ : ์ฌ์ฉ์๊ฐ ์์ ์ด ์ํ ์๋ฒ ์ ๋ณด๋ฅผ ์กฐํํ๋ ์์
์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ฆผ
- ์ฌ์ฉ์๋ ํ๊ท ์ ์ผ๋ก 5๊ฐ์ ๊ธธ๋(๋์ค์ฝ๋ ์๋ฒ)์ ์ํด ์์
- Erlang VM 1๊ฐ๋ ์ต๋ 50๋ง ๊ฐ์ ์ธ์ ์ ๊ด๋ฆฌํ ์ ์์
- ์ธ์ ์ด ์ฐ๊ฒฐ๋ ๋๋ง๋ค ์ฌ์ฉ์๊ฐ ์ํ ๋ชจ๋ ๊ธธ๋์ ์๊ฒฉ ๋ ธ๋๋ฅผ ์กฐํํด์ผ ํจ
- ์ฌ์ฉ์๊ฐ ์ํ ๊ธธ๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์๋ ์๊ฒฉ ๋ ธ๋๋ฅผ ์ฐพ๋ ์์ ์ ์ต๋ 50๋ง๊ฐ์ ์ธ์ ์ด ๋์์ ์งํํ๋ฉด ๋ถํ๊ฐ ๊ธ์ฆ
- Erlang ํ๋ก์ธ์ค ๊ฐ ์ปค๋ฎค๋์ผ์ด์ ๋น์ฉ์ 12ฮผs
- ์ธ์ ์ด ์ฌ์์๋๋ฉด ํด์ ๋ง์ ์กฐํํ๋ ๋ฐ๋ง 30์ด๊ฐ ์์๋จ
- ์ฒซ ๋ฒ์งธ ํด๊ฒฐ ๋ฐฉ๋ฒ: ETS ์ฌ์ฉํ๊ธฐ
- ETS(Erlang Term Storage): C๋ก ๊ตฌํ๋ ๋น ๋ฅด๊ณ ์์ ๊ฐ๋ฅํ ๋์ ๋๋ฆฌ
- ๋ฌธ์ ์ : ETS์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋๋ง๋ค ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํด์ผ ํจ โ ์ฑ๋ฅ ๊ฐ์ ๋ฏธ๋ฏธ
- ํด์ ๋ง ์๋ฃ๊ตฌ์กฐ๊ฐ ๊ฝค ์ปค์ ETS์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ ๋น์ฉ์ด ์ปธ์
- ETS์์์ ์กฐํ ์๋๋ ์ฝ 7ฮผs์์ง๋ง, ํด์ ๋ง ์กฐํ์๋ ์ฌ์ ํ 17.5์ด ์์ โ ์ฑ๋ฅ์ด ์ถฉ๋ถํ ๊ฐ์ ๋์ง ์์
- ๋ ๋ฒ์งธ ํด๊ฒฐ ๋ฐฉ๋ฒ: mochiglobal ๋ชจ๋ ์ฌ์ฉํ๊ธฐ
- mochiglobal์ Erlang VM์ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ read-pnly shared heap์ ์ ์ฅํด์ค
- mochiglobal์ ์ฌ์ฉํ๋ฉด ํ๋ก์ธ์ค๋ค์ ๋ฐ์ดํฐ ๋ณต์ฌ ์์ด๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์์
- mochiglobal์ ๋ฐ์ดํฐ๋ฅผ ๋ณ์๊ฐ ์๋๋ผ ํจ์๋ก ๋ง๋ค์ด์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ
- ๋ฐ์ดํฐ ํ์ ๋น์ฉ์ 0.3ฮผs๋ก ์ ๊ฐ โ ์ ์ฒด ์กฐํ ์๊ฐ์ด 750ms๋ก ๋จ์ถ๋จ
- ๋จ์ : ์๋ฃ๊ตฌ์กฐ๊ฐ ๋๋ฌด ํฌ๋ฉด ํด๋น ํจ์๋ฅผ ๊ฐ๋ Erlang ๋ชจ๋์ ์์ฑํ๋ ๋ฐ ์ต๋ 1์ด ์์
- ํด์ ๋ง์ ์์ฃผ ์์ ํ์ง๋ ์๊ธฐ์ ๊ฐ๋น ๊ฐ๋ฅํ ๋จ์ ์ด์์
- mochiglobal์ Elixir๋ก ํฌํ
ํ๊ณ ,
atom
์ด ์์ฑ๋์ง ์๋๋ก ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ FastGlobal ๊ฐ๋ฐ- mochiglobal์ Erlang์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ ๊ธฐ์ ์ด์๊ธฐ์, Elixir์์ ์ฌ์ฉํ๋ ค๋ฉด ํฌํ ์ด ํ์ํ์
- ์ํฐ์ด๋?
- Erlang๊ณผ Elixir์์ ์ฌ์ฉํ๋ ํน์ํ ํ์ ์ผ๋ก, ์ผ์ข ์ ๊ณ ์ ๋ ์ด๋ฆ์ ๊ฐ์ง ๊ฐ
:ok
,:error
,:start
๋ฑ
- ์ํฐ์ ํ๋ฒ ์์ฑ๋๋ฉด ์ ๋ ์ญ์ ๋์ง ์๊ธฐ ๋๋ฌธ์, ๋๋ฌด ๋ง์ด ๋ง๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ค ์ฐจ์ ํ๋ก๊ทธ๋จ์ด ์ฃฝ์ด๋ฒ๋ฆผ
3. ์ ํ๋ ๋์์ฑ (Limited Concurrency)
- ๋ ธ๋ ์กฐํ(lookup)์์ ๋ฐ์ํ๋ hot path ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ค, ๊ฐ ๊ธธ๋ ๋ ธ๋์ PID๋ฅผ ์ฐพ๋ ํ๋ก์ธ์ค๋ค์ด ์ง์ฐ๋๊ณ ์์์ ๋ฐ๊ฒฌํจ
- ์ด์ ์๋ ๊ธธ๋ ๋ ธ๋๋ฅผ ์ฐพ๋ ์๋๊ฐ ๋๋ ค์ ์์ฒญ์ด ์ฒ์ฒํ ๋ค์ด์์ง๋ง, ๋ ธ๋ ์กฐํ ์๋๊ฐ ๋นจ๋ผ์ง๋ฉด์ ๋ฌธ์ ๊ฐ ๋๋ฌ๋ ๊ฒ
- ์๋ก์ด ๋ฌธ์ : ์ฝ 500๋ง ๊ฐ์ ์ธ์
ํ๋ก์ธ์ค๊ฐ ํ๊บผ๋ฒ์ 10๊ฐ์ ๊ธธ๋ ์กฐํ ํ๋ก์ธ์ค์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์์ํจ
- ๊ธธ๋ ์กฐํ ํ๋ก์ธ์ค๋ ๊ธธ๋ ๋ ธ๋ ๋น 1๊ฐ์ฉ ์กด์ฌ
- ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ์์ธ
- ์ธ์ ํ๋ก์ธ์ค๊ฐ ๊ธธ๋ ๋ ์ง์คํธ๋ฆฌ์ ์์ฒญ์ ๋ณด๋
- ๊ธธ๋ ๋ ์ง์คํธ๋ฆฌ๋ ๋ฐ๋น ์ ์ ๋ ์๋ตํ์ง ๋ชปํ๊ณ , ์์ฒญ์ ๋ณด๋ธ ์ธ์ ํ๋ก์ธ์ค๋ timeout๋จ
- ์ธ์ ํ๋ก์ธ์ค๋ backoff ํ ์์ฒญ์ ๋ค์ ๋ณด๋ด์ง๋ง, ์์ฒญ์ด ์ง์์ ์ผ๋ก ๊ธธ๋ ๋ ์ง์คํธ๋ฆฌ์ ํ์ ์์ฌ ๋ณต๊ตฌํ ์ ์๋ ์ํ๊ฐ ๋จ
- ์ธ์ ํ๋ก์ธ์ค๋ ๊ธธ๋ ๋ ์ง์คํธ๋ฆฌ์ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ฉฐ block๋๋ฏ๋ก ๋ค๋ฅธ ์๋น์ค๋ก๋ถํฐ ์จ ๋ฉ์ธ์ง๋ ์ฒ๋ฆฌํ ์ ์์
- ์ธ์ ํ๋ก์ธ์ค์ ๋ฉ์ธ์ง ํ๊ฐ ์ ์ ์ปค์ ธ์ ๊ฒฐ๊ตญ Erlang VM ์ ์ฒด๊ฐ Out Of Memory๋ก ๋ค์ด๋จ โ ์ฐ์์ ์ธ ์๋น์ค ์ฅ์ ๊ฐ ๋ฐ์
- ์ด์์ ์ธ ํด๊ฒฐ์ฑ
- ์์ฒญ ์คํจ๊ฐ ๋ถ๊ฐํผํ ๊ฒฝ์ฐ, ๊ธธ๋ ๋ ์ง์คํธ๋ฆฌ์ ์์ ์์ฒญ์ ๋ณด๋ด์ง ์๋๋ก ํ๋ก์ธ์ค๋ฅผ ๋ ๋๋ํ๊ฒ ๋ง๋ค๊ธฐ
- ์ํท ๋ธ๋ ์ด์ปค๋ฅผ ์ฌ์ฉํ ์๋ ์์์ง๋ง, ๋์ค์ฝ๋ ํ์ ์ํท ๋ธ๋ ์ด์ปค๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ง ์์์
- timeout ๋ฐ์์ด ๊ธ์ฆํ๋ ๊ฒฝ์ฐ, ์ผ์ ์๊ฐ ๋์ ๋ชจ๋ ์์ฒญ์ด ์ฐจ๋จ๋๋ ์ํ๋ฅผ ์์น ์์๊ธฐ ๋๋ฌธ
- ๋ค๋ฅธ ์ธ์ด์์๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ์๊ณ ์์์ง๋ง, Elixir์์๋ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ์์๋ด์ผ ํ์
- ๋ค๋ฅธ ์ธ์ด์์๋ atomic ์นด์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ ์์ฒญ ์๋ฅผ ์ถ์ ํ๋ ๋ฐฉ์์ ์ด์ฉ
- ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ ์์ฒญ ์๊ฐ ๋๋ฌด ๋ง์ผ๋ฉด ๋ฏธ๋ฆฌ ์์ฒญ์ ์ทจ์ํ๋ ๋ฐฉ์์ผ๋ก semaphore๋ฅผ ๊ตฌํํ์
- ๋ณดํต semaphore๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ
- ํ์ง๋ง Elrang VM์ ํ๋ก์ธ์ค ๊ฐ ํต์ ์ ์ค์ฌ์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์, ํ์ฌ ์งํ์ค์ธ ์์ฒญ ๊ฐ์๋ฅผ ๊ณต์ ํ๊ธฐ ์ํด ๋ณ๋์ ๋ฉ์ธ์ง ํต์ ์ด ํ์ํ์
- Elrang VM์์๋ ํ๋ก์ธ์ค ๊ฐ ๋ฉ์ธ์ง ํต์ ์ ๊ธฐ๋ฐ์ผ๋ก ์ธ๋งํฌ์ด๋ฅผ ๊ตฌํํ ์ ์์์ง๋ง, ๋์ค์ฝ๋ ํ์ ์์ฒญ ๊ฐ์ ์กฐ์ ์ ์ํด ํ๋ก์ธ์ค๋ฅผ ๊ณผ๋ถํ์ํค๊ณ ์ถ์ง ์์์
- ๊ฐ ํ๋ก์ธ์ค๋ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๋ฏ๋ก, ์๋ก ๊ณต์ ํ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๊ณ ๋ชจ๋ ๋ฐ์ดํฐ๋ ๋ฉ์ธ์ง๋ฅผ ํตํด ์ ๋ฌ๋จ
- ๋ฐ๋ผ์ Elrang VM์์ ์ธ๋งํฌ์ด๋ฅผ ๊ตฌํํ๋ ค๋ฉด ์งํ์ค์ธ ์์ฒญ ๊ฐ์๋ฅผ ํ์ธํ๋ ์์ ์ ๋ด๋นํ๋ ํ๋ก์ธ์ค๊ฐ ํ์ํจ
- ์ด ์์ ์ ํ๋์ ํ๋ก์ธ์ค๊ฐ ๋ด๋นํ๋ฉด ๋๋ฌด ๋ง์ ์์ฒญ์ด ๋ชฐ๋ ค ํด๋น ํ๋ก์ธ์ค๊ฐ ๊ณผ๋ถํ๋ ์ ์์
- ์ธ์ ํ๋ก์ธ์ค๋ ์๋ฐฑ๋ง ๊ฐ๊ฐ ์กด์ฌํ๊ณ , ์ธ์ ํ๋ก์ธ์ค๊ฐ ๊ธธ๋ ์ ๋ณด๋ฅผ ์์ฒญํ ๋๋ง๋ค 'ํ์ฌ ์งํ์ค์ธ ์์ฒญ ๊ฐ์'๋ฅผ ํ์ธํด์ผ ํ๊ธฐ ๋๋ฌธ
- ๋์ค์ฝ๋ ํ์ ์ค์ ํ๋ก์ธ์ค ๋์ , ETS๊ฐ์ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์์ฒญ ๊ฐ์๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ํ
:ets.update_counter/4
๊ธฐ๋ฅ ์ด์ฉ- ํด๋น ๊ธฐ๋ฅ์ ETS ๋ด์ ๊ฐ์ ์์์ ์ผ๋ก ์ฆ๊ฐ์ํค๋ ์ฐ์ฐ์ ์ํํ๋ ๋์์ ํ์ฌ ๊ฐ์ ๋ฐํํจ
- ์ถ๊ฐ์ ์ธ ์ฝ๊ธฐ ์ฐ์ฐ ์์ด ์นด์ดํฐ ๊ฐ์ ๋ฐ๋ก ํ์ธํ ์ ์์ด ๋ค์ค ํ๋ก์ธ์ค ํ๊ฒฝ์์๋ ์์ ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์
- ๋ํ ETS๋ฅผ
write_concurrency
๋ชจ๋๋ก ์คํํ์ฌ ๋์ ๋์์ฑ์ ํ๋ณด โ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ํ๋์ ๋ฐ์ดํฐ์ ๋์ ์ ๊ทผํด๋ ๋ด๋ถ์ ์ผ๋ก ์ต์ ํ๋์ด ๋ณ๋ ฌ ์ฒ๋ฆฌ ๊ฐ๋ฅ
- ์ ๋ฐฉ๋ฒ์ ๊ธฐ๋ฐ์ผ๋ก ์ธ๋งํฌ์ด(semaphore) ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์
- ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๊ณ , ๋์ ์ฒ๋ฆฌ๋ ํ๊ฒฝ์์๋ ๋ฐ์ด๋ ์ฑ๋ฅ์ ๋ฐํํจ
- ์ฐ์์ ์ธ ์ฅ์ ๋ก๋ถํฐ ๋์ค์ฝ๋์ Elixir ์ธํ๋ผ๋ฅผ ๋ณดํธํด์ค
- ์ค์ ๋ก ์ ์ ์ํ ๊ด๋ฆฌ ์๋น์ค๊ฐ ๊ด๋ จ์๋ ์ด์๋ก ์ธํด ์ค๋จ๋์์ง๋ง, ์ธ์ ์๋น์ค๋ ์ํฅ์ ๋ฐ์ง ์์์ผ๋ฉฐ ์ ์ ์ํ ๊ด๋ฆฌ ์๋น์ค๋ ๋ช ๋ถ ๋ด๋ก ์ฌ์์๋จ
semaphore_name = :my_semaphore
semaphore_max = 10
case Semaphore.call(semaphore_name, semaphore_max, fn -> :ok end) do
:ok ->
IO.puts "success"
{:error, :max} ->
IO.puts "too many callers"
end
'๐๐ญ๐ฎ๐๐ฒ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring ๊ด๋ จ CS ์ง๋ฌธ ์ ๋ฆฌ (1) | 2023.11.02 |
---|