[Erlang] OTP: Let It Crash

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

Let It Crash๋Š” Erlang์„ ์ƒ์ง•ํ•˜๋Š” ํ‘œ์–ด๋‹ค.

Erlang์€ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค ๊ธฐ๋ฐ˜์˜ ๋™์‹œ์„ฑ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋†’์€ ๊ฐ€์šฉ์„ฑ์„ ์ถ”๊ตฌํ•˜๋Š”๋ฐ, Erlang์˜ ๊ฐ€์šฉ์„ฑ ์ง€ํ–ฅ ๋ฐฉ์‹์€ ์œ ์ง€๋‚˜ ์ฒ˜๋ฆฌ๋Ÿ‰ ์ตœ์ ํ™”๋ณด๋‹จ ๋น ๋ฅธ ๋ณต๊ตฌ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ํŠน๋ณ„ํ•œ ์ ์ด๋‹ค.

์ด๋Ÿฐ ์ง€ํ–ฅ์  ๋•๋ถ„์— ๋А๋ฆฌ์ง€๋งŒ ์•ˆ์ •์ ์ธ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•˜๋Š” ๋ฐ์— ์šฉ์ดํ•˜๊ณ , ์‹ค์ œ๋กœ๋„ ํ†ต์‹  ๋ถ„์•ผ์— ํ•œํ•ด์„œ๋Š” ๊ฝค ์ง€๋ฐฐ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค. ๊ทธ๊ฑฐ ๋ง๊ณ ๋Š” ์ „๋ฉธ์ด๊ธด ํ•˜๋‹ค๋งŒ...




ํŠน์ง•

๊ธฐ๋ณธ์ ์ธ ์ง€ํ–ฅ์ /์›๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ๋กœ์ง์— ๋ญ”๊ฐ€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ๋ณต์žกํ•˜๊ฒŒ ์˜ค๋ฅ˜์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ๊ทธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฃฝ์—ฌ๋ฒ„๋ฆฐ๋‹ค.

  2. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฃฝ์œผ๋ฉด, ์ตœ์ƒ์œ„ 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