[Erlang] OTP

[์›๋ณธ ๋งํฌ]

OTP๋Š” Open Telecom Platform์˜ ์ถ•์•ฝ์œผ๋กœ, Erlang์˜ ๋ถ„์‚ฐ์‹œ์Šคํ…œ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชจ์Œ, ํ˜น์€ ๊ทธ๋Ÿฌํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋งํ•œ๋‹ค.
Erlang์˜ ์กด์žฌ ๋ชฉ์ ์ด๊ธฐ๋„ ํ•˜๋‹ค.

Telecom์ด ๋“ค์–ด๊ฐ€์žˆ๊ธด ํ•œ๋ฐ, ํ†ต์‹ ์—๋งŒ ์“ธ์ˆ˜ ์žˆ๋Š”๊ฑด ์•„๋‹ˆ๊ณ , ๋ง‰ ์—„์ฒญ๋‚œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค.
๊ทธ๋ƒฅ ์ฑ„๋„ ๋“ฑ์„ ํฌํ•จํ•œ erlang์˜ ํ•˜์œ„ ๊ธฐ๋Šฅ์š”์†Œ๋“ค๊ณผ, ๊ทธ๊ฑธ ์ด์šฉํ•œ ๊ตฌํ˜„ ํŒจํ„ด์„ ๋งํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํ˜„์žฌ์˜ ๋น„๋™๊ธฐ-๋ถ„์‚ฐ์‹œ์Šคํ…œ์˜ ์ด๋ก ์  ๋ชจํƒœ์ด๊ธฐ๋„ ํ•˜๋‹ค.
ํ”ํžˆ Go, Rust์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ฑ„๋„์˜ ๊ฐœ๋…์ด ์—ฌ๊ธฐ์—์„œ ๋‚˜์™”๋‹ค.




supervision tree

erlang OTP๋Š” supervision tree๋ผ๋Š” ํ˜•ํƒœ๋กœ ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ์—ฐ๊ฒฐ, ํ†ต์‹ ์„ ๊ด€๋ฆฌํ•œ๋‹ค.
์—ฌ๊ธฐ์„œ ๋™๊ทธ๋ผ๋ฏธ๊ฐ€ Worker, ๋„ค๋ชจ๊ฐ€ Supervisor๋‹ค. OTP์—์„œ๋Š” ์ด ๋‘˜์„ ์—„๊ฒฉํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•ด์„œ ์—ญํ• ์„ ๊ตฌ๋ถ„ํ•œ๋‹ค.

Worker๋Š” ์ˆœ์ˆ˜ํ•œ ์˜๋ฏธ์˜ ์ž‘์—…์ž ํ”„๋กœ์„ธ์Šค๋‹ค. ์‹ค์ œ๋กœ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ์ž‘์—…๋“ค์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
ํ•˜์ง€๋งŒ worker๋Š” ์–ธ์ œ๋“  Supervisor์— ์˜ํ•ด ์‚ฌ๋ผ์ง€๊ฑฐ๋‚˜, ์ƒ๊ธฐ๊ฑฐ๋‚˜, ๋ณ€๋™๋  ์ˆ˜ ์žˆ๋‹ค.

Supervisor๋Š” worker๋“ค์„ ๊ด€๋ฆฌ๋งŒ ํ•˜๋Š” ๊ด€๋ฆฌ ์ „์šฉ ํ”„๋กœ์„ธ์Šค๋‹ค.

erlang OTP๋Š” ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ๋‚ด๊ฒฐํ•จ์„ฑ(fault-tolerant)์„ ๋ณด์žฅํ•œ๋‹ค.

๊ทผ๋ฐ erlang์ด ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ ํ…œํ”Œ๋ฆฟ์„ ์นœ์ ˆํ•˜๊ฒŒ ์ œ๊ณตํ•˜๋Š”๊ฑด ์•„๋‹ˆ๋ผ์„œ, ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”๊ฒŒ ๋งŽ๋‹ค. ๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์—์„œ๋Š” ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ ํ˜•ํƒœ๋งŒ ๋Œ€์ถฉ ๋ณด์ด๊ณ  ์ œ๋Œ€๋กœ ๋œ ์›Œ์ปค ํŠธ๋ฆฌ ๊ตฌ์กฐ๋Š” ๋‚˜์ค‘์— ๋‹ค๋ค„๋ณด๊ฒ ๋‹ค.





๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋žจ ๋งŒ๋“ค์–ด๋ณด๊ธฐ

์˜ˆ์‹œ๋กœ ๊ฐ„๋‹จํ•œ ์ค‘์•™ ์„œ๋ฒ„๊ฐ€ ์žˆ๊ณ , ์ค‘์•™ ์„œ๋ฒ„์— rpc๋ฅผ ํ†ตํ•ด ๋กœ์ง์„ ์ œ๊ณตํ•˜๋Š” ํ•˜์œ„ ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ๋ณด๊ฒ ๋‹ค.

์šฐ์„  ์„œ๋ฒ„ ์ฝ”๋“œ๋‹ค.

-module(server). 
-export([start/2, rpc/2]). 

% ํŠน์ • ์ด๋ฆ„์„ ๊ฐ€์ง€๋Š” ์„œ๋ฒ„ ๋ฃจํ”„๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค.
start(Name, Mod) -> 
   register(Name, spawn(fun() -> loop(Name, Mod, Mod:init()) end)). 

% ํŠน์ • ์ด๋ฆ„์„ ๊ฐ€์ง„ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ Request๋ฅผ ๋ณด๋‚ด๊ณ , Response๋ฅผ ๋ฐ›๋Š”๋‹ค.
rpc(Name, Request) -> 
   Name ! {self(), Request}, 
   receive 
      {Name, Response} -> Response 
   end. 

% ๋ฌดํ•œ๋ฃจํ”„๋ฅผ ๋Œ๋ฉฐ ๊ณ„์†ํ•ด์„œ Request๋ฅผ ๋ฐ›๊ณ , Mod:handle/2๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ Response๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
loop(Name, Mod, State) ->
   receive 
      {From, Request} ->
         {Response, State1} = Mod:handle(Request, State), 
         From ! {Name, Response}, 
         loop(Name, Mod, State1) 
   end.

start ํ•จ์ˆ˜๋Š” ํ•˜์œ„ ์„œ๋ฒ„์˜ ์ด๋ฆ„๊ณผ, ๋ชจ๋“ˆ๋ช…์„ ์ „๋‹ฌ๋ฐ›๊ณ  ๋ชจ๋“ˆ์„ ์„œ๋ฒ„์— ๋“ฑ๋กํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  rpc ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ๋“ฑ๋ก๋œ ํ•˜์œ„์„œ๋ฒ„๋“ค์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ ๋‹ค์Œ์—๋Š” ํ•˜์œ„์„œ๋ฒ„๋กœ ์‚ฌ์šฉํ•  name_server ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๊ฒ ๋‹ค.
๊ทธ๋ƒฅ ๋”•์…”๋„ˆ๋ฆฌ ํ•˜๋‚˜ ๋‘๊ณ , ํ‚ค:๊ฐ’ ์Œ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์กฐํšŒํ•  ์ˆ˜๋งŒ ์žˆ๋Š” ๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„๋‹ค.

-module(name_server). 
-export([init/0, add/2, whereis/1, handle/2]). 
-import(server, [rpc/2]). 

% ์ค‘์•™ ์„œ๋ฒ„์— rpc ์š”์ฒญ (์ค‘์•™ ์„œ๋ฒ„์—์„œ ๋‹ค์‹œ handler๋กœ echo)
add(Name, Place) -> rpc(name_server, {add, Name, Place}). 
whereis(Name) -> rpc(name_server, {whereis, Name}). 

init() -> dict:new().

% rpc ํ˜ธ์ถœ์‹œ ์‘๋‹ตํ•  ํ•ธ๋“ค๋Ÿฌ๋“ค
handle({add, Name, Place}, Dict) -> {ok, dict:store(Name, Place, Dict)}; 
handle({whereis, Name}, Dict) -> {dict:find(Name, Dict), Dict}.

handle ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์‹ค์งˆ์ ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ , ์‹ค์ œ ํ˜ธ์ถœ์€ ์ค‘์•™ ์„œ๋ฒ„๋ฅผ ํ†ตํ•˜๋„๋ก ํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ € 2๊ฐœ์˜ ์†Œ์ŠคํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋ ‡๊ฒŒ 2๊ฐœ์˜ beam ํŒŒ์ผ์ด ๋–จ์–ด์ง€๋ฉด ๋œ ๊ฒƒ์ด๋‹ค.

erl ์ธํ„ฐํ”„๋ฆฌํ„ฐ์— ์ง„์ž…ํ•ด์„œ

server:start(name_server, name_server).

name_server๋ฅผ ์‹คํ–‰์‹œ์ผœ์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ  name_server์˜ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด์„œ add ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

name_server:add(erlang,"foo").

๊ทธ๋Ÿผ whereis ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ €์žฅํ•œ ๊ฐ’์„ ๋‹ค์‹œ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ ๊ฐ ๋ชจ๋“ˆ์„ ํ”„๋กœ์„ธ์Šค๋กœ ๋„์šฐ๊ณ  ํ”„๋กœ์„ธ์Šค๊ฐ„ ํ†ต์‹ ์„ ํ†ตํ•ด IPC๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š”๊ฒŒ ์ฃผ๋œ ์ปจ์…‰์ด๋‹ค.



์ฐธ์กฐ
https://www.erlang.org/
https://www.tutorialspoint.com/erlang/erlang_otp.htm

https://learnyousomeerlang.com/building-applications-with-otp