๋””์Šค์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ Elixir๋กœ 500๋งŒ๋ช…์˜ ๋™์‹œ ์ ‘์†์ž๋ฅผ ์ฒ˜๋ฆฌํ–ˆ์„๊นŒ?

2025. 3. 11. 23:03ยท ๐’๐ญ๐ฎ๐๐ฒ
๋ชฉ์ฐจ
  1. 0. ๋“ค์–ด๊ฐ€๊ธฐ์— ์•ž์„œ
  2. 1. ๋ฉ”์„ธ์ง€ ํŒฌ์•„์›ƒ(Message Fanout)
  3. 2. ๊ณต์œ  ๋ฐ์ดํ„ฐ์— ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•˜๊ธฐ
  4. 3. ์ œํ•œ๋œ ๋™์‹œ์„ฑ (Limited Concurrency)

์ด ๊ธ€์€ ๋””์Šค์ฝ”๋“œ ๋ธ”๋กœ๊ทธ์˜ '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/๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€
        • ๊ฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋ƒ„ โ†’ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€
  • ๊ฒฐ๋ก : ๋…ธ๋“œ ๊ฐ„ ๋ฉ”์„ธ์ง€ ์ „์†ก ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…์— ์ฐฉ์•ˆํ•˜์—ฌ, 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๋ฒˆ ํ˜ธ์ถœ
    • ๋Œ€์ฒด ์šฉ์ด: 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
  1. 0. ๋“ค์–ด๊ฐ€๊ธฐ์— ์•ž์„œ
  2. 1. ๋ฉ”์„ธ์ง€ ํŒฌ์•„์›ƒ(Message Fanout)
  3. 2. ๊ณต์œ  ๋ฐ์ดํ„ฐ์— ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•˜๊ธฐ
  4. 3. ์ œํ•œ๋œ ๋™์‹œ์„ฑ (Limited Concurrency)
'๐’๐ญ๐ฎ๐๐ฒ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • Spring ๊ด€๋ จ CS ์งˆ๋ฌธ ์ •๋ฆฌ
gorapaduckoo
gorapaduckoo
gorapaduckoo
์ง„ํ™”์˜ ๋Œ
gorapaduckoo
์ „์ฒด
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
    • ๐€๐ฅ๐ ๐จ๐ซ๐ข๐ญ๐ก๐ฆ
    • ๐‚๐’
      • ๐‰๐š๐ฏ๐š
      • ๐ƒ๐š๐ญ๐š๐›๐š๐ฌ๐ž
      • ๐๐ž๐ญ๐ฐ๐จ๐ซ๐ค
      • ๐„๐ญ๐œ.
    • ๐’๐ฉ๐ซ๐ข๐ง๐ 
      • ๐๐š๐ฌ๐ข๐œ
      • ๐Œ๐•๐‚ (๐Ÿ)
      • ๐’๐ž๐œ๐ฎ๐ซ๐ข๐ญ๐ฒ
    • ๐๐ซ๐จ๐ฃ๐ž๐œ๐ญ๐ฌ
      • ๐‘๐ž๐œ๐จ๐ฎ๐ซ๐ญ๐š
      • ๐’๐ข๐ฅ๐ญ๐š๐ซ๐š๐ž
    • ๐†๐ข๐ญ
    • ๐‘๐ž๐ฏ๐ข๐ž๐ฐ
    • ๐’๐ญ๐ฎ๐๐ฒ

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • DI
  • http
  • ๊ตฌํ˜„
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
  • ๋น„ํŠธ๋งˆ์Šคํ‚น
  • spring mvc
  • ๋ธŒ๋ฃจํŠธํฌ์Šค
  • ๋„คํŠธ์›Œํฌ
  • CS
  • Union-FInd
  • Spring ๊ธฐ๋ณธํŽธ
  • ํŠธ๋ฆฌ
  • spring
  • dp
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • DFS
  • ์—๋“œ๋ชฌ๋“œ-์นดํ”„
  • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
  • OOP
  • ๋ฐฑ์ค€
  • mvc ํŒจํ„ด
  • ๋ฝ
  • IOC
  • BOJ
  • aop
  • web

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

hELLO ยท Designed By ์ •์ƒ์šฐ.v4.2.2
gorapaduckoo
๋””์Šค์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ Elixir๋กœ 500๋งŒ๋ช…์˜ ๋™์‹œ ์ ‘์†์ž๋ฅผ ์ฒ˜๋ฆฌํ–ˆ์„๊นŒ?
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.