[Erlang] OTP: Let It Crash
Let It Crash๋ Erlang์ ์์งํ๋ ํ์ด๋ค.
Erlang์ ๋ฉํฐํ๋ก์ธ์ค ๊ธฐ๋ฐ์ ๋์์ฑ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ ๊ฐ์ฉ์ฑ์ ์ถ๊ตฌํ๋๋ฐ, Erlang์ ๊ฐ์ฉ์ฑ ์งํฅ ๋ฐฉ์์ ์ ์ง๋ ์ฒ๋ฆฌ๋ ์ต์ ํ๋ณด๋จ ๋น ๋ฅธ ๋ณต๊ตฌ์ ์๋ค๋ ๊ฒ์ด ํน๋ณํ ์ ์ด๋ค.
์ด๋ฐ ์งํฅ์ ๋๋ถ์ ๋๋ฆฌ์ง๋ง ์์ ์ ์ธ ์์คํ ์ ์ค๊ณํ๋ ๋ฐ์ ์ฉ์ดํ๊ณ , ์ค์ ๋ก๋ ํต์ ๋ถ์ผ์ ํํด์๋ ๊ฝค ์ง๋ฐฐ์ ์ผ๋ก ์ฌ์ฉ๋๊ณ ์๋ค. ๊ทธ๊ฑฐ ๋ง๊ณ ๋ ์ ๋ฉธ์ด๊ธด ํ๋ค๋ง...
ํน์ง
๊ธฐ๋ณธ์ ์ธ ์งํฅ์ /์๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ๋ค.
-
๋ก์ง์ ๋ญ๊ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด, ๋ณต์กํ๊ฒ ์ค๋ฅ์ฒ๋ฆฌ๋ฅผ ํ์ง ์๊ณ ๊ทธ๋ฅ ๊ทธ ํ๋ก์ธ์ค๋ฅผ ์ฃฝ์ฌ๋ฒ๋ฆฐ๋ค.
-
ํ๋ก์ธ์ค๊ฐ ์ฃฝ์ผ๋ฉด, ์ต์์ supervisor ํ๋ก์ธ์ค๊ฐ ๊ทธ๊ฑธ ํ์งํด์ ํ๋ก์ธ์ค๋ฅผ ๋ค์ ์คํํ๋ค.
์ด๋ฅผ ํตํด ๊ฐ์ฉ์ฑ ๋ฌธ์ ๋ฅผ ๋น๊ต์ ์ฝ๊ณ ๋จ์ํ๊ฒ ํ๊ฒ ๋ค๋ ๊ฒ์ด๋ค.
์ค์ ๋ก Erlang์ ์ธ์ด ์์ฒด์์ ๋ณต์กํ ๋ฐฉ์ด์ ์ฝ๋ ์์ฑ์ ๊ถ์ฅํ์ง ์๋๋ค. ๊ทธ๋ฅ ์ฃฝ์ฌ๋ฒ๋ฆฌ๋ผ๋ ๊ฒ์ด๋ค.
์ฝ๋๋ก ์๋ฅผ ๋ค์ด๋ณด์๋ฉด, ๋๋ถ๋ถ์ ์ธ์ด์์๋ ๋ค์๊ณผ ๊ฐ์ ์ง๋ฃจํ๊ณ ํํ์ ์ธ ์์ธ์ฒ๋ฆฌ๊ฐ ์๋ฐ๋๋ค.
try {
// ์๋ง์ ์์ธ ์ฒ๋ฆฌ ์ฝ๋
result = risky_operation();
if (result == null) {
handle_null();
}
if (result < 0) {
handle_negative();
}
// ... ๋ ๋ง์ ์กฐ๊ฑด ๊ฒ์ฌ
} catch (SomeException e) {
// ๋ณต๊ตฌ ์๋
} catch (AnotherException e) {
// ๋ค๋ฅธ ๋ณต๊ตฌ ์๋
} finally {
// ์ ๋ฆฌ ์์
}
Erlang์์๋ ์ด๊ฑธ ์ข ๋ ๋จ์ํ๊ฒ ํผ๋ค.
execute_task(Type, Args) ->
% ์์ธ ์ฒ๋ฆฌ ์์ - crashํ๋ฉด Supervisor๊ฐ ์ฌ์์
[H | T] = get_list(Type, Args), % ๋น์ด์์ผ๋ฉด crash
Result = 100 div Args, % 0์ด๋ฉด crash
{ok, Result}.
%% Supervisor๊ฐ ์๋์ผ๋ก ์ฌ์์
supervise(Worker) ->
monitor(Worker),
receive
{'DOWN', ...} -> start_new_worker()
end.
์ฝ๋ ์์ค์์๋ ์ข ๋ ๊ฐ๊ฒฐํด์ง๊ณ , ์ ๊ฒฝ์ธ ๋ถ๋ถ์ด ์ ์ด์ง๊ธด ํ๋ค.
๊ฒ๋ค๊ฐ Erlang์ ์ธ์ด ์์ฒด์์ ๋ฉํฐ๋
ธ๋ ๋ถ์ฐ ๊ตฌ์ฑ์ ์ง์ํ๊ธฐ๋ ํ๋ค.
์ฌ๋ฌ๊ฐ์ ์ฅ๋น๋ค์์ ์์ปค ํ๋ก์ธ์ค๋ฅผ ๋ณ๋ ฌ๋ก ์คํํ๊ณ ๊ฐ๋
ํ ์ ์๋ ๊ฒ์ด๋ค.
์ด๋ฐ ๋จ์์ฑ๊ณผ ๋์ ๊ฐ์ฉ์ฑ ๋ณด์ฅ ๋์, ๋ถ๋ถ์ ์ธ ์คํจ๋ฅผ ํ์ฉํ๊ณ ์ ์ฒด ์์คํ ์์ค์ ๋ค์ดํ์์ ๊ทน๋๋ก ์ต์ ํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค. ๊ทธ๋์ ๋งค์ฐ ๋์ ๊ฐ์ฉ์ฑ์ ์ ์งํด์ผํ๋ ์ฐ์ ์์๋ ์๊ทผํ ์ ์ฉ๋๊ณ ์๋ค.
๋ฌธ์
๊ทธ๋ ๋ค๊ณ ์ด๊ฒ ์ฅ์ ๋ง ์์๊น? ๊ทธ๋ฌ๋ฉด ๋ชจ๋ ์์คํ ์ด OTP์ ๋ฐฉ๋ฒ๋ก ์ ์์ฉํด์ ์ฌ์ฉํ์ ๊ฒ์ด๋ค.
์ด๊ฑด ์ด๋ป๊ฒ ๋ณด๋ฉด ๊ฒ์ผ๋ฅธ ๋ฐฉ๋ฒ๋ก ์ด๋ค.
๋จ์ํ ํ๋์จ์ด ์์ค์ ์ผ์์ ์ฅ์ ๊ณ , ์ฌ์์ํด์ ํด๊ฒฐ์ด ๋๋ ๋ฌธ์ ๋ผ๋ฉด Erlang์ ๋ฐฉ๋ฒ๋ก ๋ ํจ๊ณผ์ ์ผ ์ ์๋ค.
ํ์ง๋ง ์ฌ์์๋ง์ผ๋ก ํด๊ฒฐ๋์ง ์๋ ์๊ตฌ์ ์ธ ๋ฌธ์ ๊ฑฐ๋, ๋ณธ์ง์ ์ธ ํด๊ฒฐ์ด ์๊ตฌ๋๋ ๋ฌธ์ ๋ผ๋ฉด ์ด ๋ฐฉ๋ฒ์ ์ญํจ๊ณผ๋ฅผ ์ผ์ผํฌ ์ ์๋ค. ์ง์ง๋ก ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ํด์ ๋ช
ํํ ์ฒ๋ฆฌ๋ฅผ ํด์ผํ๋ ์ง์ ๋ ๋ง์ด ์กด์ฌํ๋ค.
๊ฒ๋ค๊ฐ ๋๋ฒ๊น
์ ์ฉ์ดํ์ง๋ ์๊ณ , ํ๋ก์ธ์ค ์ฌ์์์์ ๋ฐ์ํ๋ ์ฑ๋ฅ ๋ญ๋น๋ ์๋ค.
์ฌ์ค ๋ฌด์๋ณด๋ค Erlang์ด ์ธ๋ฉด๋ฐ์ ๊ฐ์ฅ ํฐ ์ด์ ๋, ์ ์ดํ ์ฐ์ฐ ์ฑ๋ฅ๋ ์๋ค. ๋ด๊ฐ ์์ ์ ์คํํด๋ณด๊ธฐ๋ก ๋จ์ํ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ๋ฉ์ด์ ํ ์ธ์ด ์ค์์ ๋ ๋ณด์ ์ผ๋ก ๋๋ ธ๋ค.
๊ฐ๋ ์ ํ์ฅ
Let It Crash๋ผ๋ ๊ฐ๋ ์์ฒด๋ ์ด๋ป๊ฒ ๋ณด๋ฉด ์ฌํ ๋ถ์ฐ์์คํ ๋ค์ ์งํฅ์ฑ๊ณผ๋ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค.
์ฟ ๋ฒ๋คํฐ์ค๋ statelessํ ๊ตฌ์กฐ๋ฅผ ์งํฅํ๋ฉฐ, ์๋ฒ๊ฐ ์ธ์ ๋ ๋ค์ด๋ ๊ฒ์ด๋ผ ๊ฐ์ ํ๊ณ ์๋ฒ๋ฅผ ์ฌ์์ํ ์ค๋น๋ฅผ ํ๋ค. ์ฟ ๋ฒ์ ๋ง์คํฐ ๋
ธ๋๊ฐ supervisor์ ์ญํ ์ ํ๋ ์
์ด๋ค. ๊ฐ๋ฒผ์ด ํ๋ก์ธ์ค๊ฐ ์๋ ์ปจํ
์ด๋ ์์ค์์ ์ด๋ค์ง๋ ๋ณต๊ตฌ๋ผ๋ ๊ฒ์ด ๋ค๋ฅธ ์ ์ด์ง๋ง, ํต์ฌ ์ ๊ทผ๋ฒ์ ๋น์ค๋ฌด๋ฆฌํ๋ค.
Erlang์ ์ด๋ฅผ ์ธ์ด ์์ค์์ ์ง์ํ ๋ฟ์ด๋ค.
๊ผญ Erlang์ด ์๋์ด๋ ๋๊ณ , Erlang์ ์ด๋ค๊ณ ํด์ ๊ฒฌ๊ณ ํ ํ๋ก๊ทธ๋จ์ด ๋์ค๋ ๊ฑด ์๋๋ค.
์ฐธ์กฐ
https://wiki.c2.com/?LetItCrash
https://stackoverflow.com/questions/4393197/erlangs-let-it-crash-philosophy-applicable-elsewhere