๋ถ„์‚ฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋นŒ๋”ฉ ๋ธ”๋ก. ์ฒซ ๋ฒˆ์งธ ์ ‘๊ทผ๋ฒ•

๋ถ„์‚ฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋นŒ๋”ฉ ๋ธ”๋ก. ์ฒซ ๋ฒˆ์งธ ์ ‘๊ทผ๋ฒ•

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

  • ์š”์ฒญ-์‘๋‹ต
  • ์š”์ฒญ ์ฒญํฌ ์‘๋‹ต
  • ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต
  • ๊ฒŒ์‹œ-๊ตฌ๋…
  • ๋ฐ˜์ „ ๊ฒŒ์‹œ ๊ตฌ๋…
  • ์ž‘์—… ๋ถ„๋ฐฐ

SOA, MSA ๋ฐ ๋ฉ”์‹œ์ง•

SOA, MSA๋Š” ์‹œ์Šคํ…œ ๊ตฌ์ถ• ๊ทœ์น™์„ ์ •์˜ํ•˜๋Š” ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜์ด๋ฉฐ ๋ฉ”์‹œ์ง•์€ ๊ตฌํ˜„์„ ์œ„ํ•œ ๊ธฐ๋ณธ ์š”์†Œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

๋ฉ”์‹œ์ง• - ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์ž…๋‹ˆ๋‹ค. ์ฃผ์š” ๋ชฉ์ ์€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ๋ณด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ •๋ณด ์ „์†ก์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค, ์‹œ์Šคํ…œ ๋‚ด์—์„œ ์ •๋ณด ์ „์†ก์„ ์œ„ํ•œ ๋…ผ๋ฆฌ ์ฑ„๋„ ํ˜•์„ฑ, ๋ผ์šฐํŒ… ๋ฐ ๋ฐธ๋Ÿฐ์‹ฑ, ์‹œ์Šคํ…œ ์ˆ˜์ค€์—์„œ์˜ ์žฅ์•  ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ๋œ ๋ฉ”์‹œ์ง•์€ rabbitmq์™€ ๊ฒฝ์Ÿํ•˜๊ฑฐ๋‚˜ ๋Œ€์ฒดํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ๊ธฐ๋Šฅ:

  • ๋ถ„ํฌ.
    ๊ตํ™˜ ์ง€์ ์€ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ์— ์ตœ๋Œ€ํ•œ ๊ฐ€๊นŒ์šด ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹จ์ˆœ์„ฑ
    ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ ์ตœ์†Œํ™”์™€ ์‚ฌ์šฉ ํŽธ์˜์„ฑ์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.
  • ๋” ๋‚˜์€ ์„ฑ๋Šฅ.
    ์šฐ๋ฆฌ๋Š” rabbitmq์˜ ๊ธฐ๋Šฅ์„ ๋ฐ˜๋ณตํ•˜๋ ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ OTP์— ๋งž๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ฐ ์ „์†ก ๊ณ„์ธต๋งŒ ์„ ํƒํ•˜์—ฌ ๋น„์šฉ์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ ์‘์„ฑ.
    ๊ฐ ์„œ๋น„์Šค๋Š” ๋งŽ์€ ๊ตํ™˜ ํ…œํ”Œ๋ฆฟ์„ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„ค๊ณ„์— ๋”ฐ๋ฅธ ํƒ„๋ ฅ์„ฑ.
  • ํ™•์žฅ์„ฑ.
    ๋ฉ”์‹œ์ง•์€ ์•ฑ๊ณผ ํ•จ๊ป˜ ์„ฑ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ถ€ํ•˜๊ฐ€ ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ๊ตํ™˜ ์ง€์ ์„ ๋ณ„๋„์˜ ๊ธฐ๊ณ„๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„๊ณ  ์ฝ”๋“œ ๊ตฌ์„ฑ ์ธก๋ฉด์—์„œ ๋ฉ”ํƒ€ ํ”„๋กœ์ ํŠธ๋Š” ๋ณต์žกํ•œ Erlang/Elixir ์‹œ์Šคํ…œ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋Š” ํ•˜๋‚˜์˜ ์ €์žฅ์†Œ(์šฐ์‚ฐ ํ”„๋กœ์ ํŠธ)์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์— ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋Š” ์ตœ๋Œ€ํ•œ ๊ฒฉ๋ฆฌ๋˜์–ด ๋ณ„๋„์˜ ์—”ํ„ฐํ‹ฐ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์ „์ฒด ์‹œ์Šคํ…œ์˜ API๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ณ  ๋ณ€๊ฒฝํ•˜๊ธฐ ์‰ฝ๊ณ  ๋‹จ์œ„ ๋ฐ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ง์ ‘ ๋˜๋Š” ๋ธŒ๋กœ์ปค๋ฅผ ํ†ตํ•ด ์ƒํ˜ธ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง•์˜ ์ž…์žฅ์—์„œ ๋ณผ ๋•Œ ๊ฐ ์„œ๋น„์Šค์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ์ˆ˜๋ช… ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์„œ๋น„์Šค ์ดˆ๊ธฐํ™”.
    ์ด ๋‹จ๊ณ„์—์„œ ์„œ๋น„์Šค ๋ฐ ์ข…์†์„ฑ์„ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์˜ ๊ตฌ์„ฑ ๋ฐ ์‹คํ–‰์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
  • ๊ตํ™˜ ์ง€์ ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    ์„œ๋น„์Šค๋Š” ํ˜ธ์ŠคํŠธ ๊ตฌ์„ฑ์— ์ง€์ •๋œ ์ •์  ๊ตํ™˜ ์ง€์ ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋™์ ์œผ๋กœ ๊ตํ™˜ ์ง€์ ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„œ๋น„์Šค ๋“ฑ๋ก.
    ์„œ๋น„์Šค๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ๊ตํ™˜ ์ง€์ ์— ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ •์ƒ ์ž‘๋™.
    ์„œ๋น„์Šค๋Š” ์œ ์šฉํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž‘์—… ์™„๋ฃŒ.
    ์…ง๋‹ค์šด์—๋Š” ์ •๊ธฐ ๋ฐ ๋น„์ƒ์˜ 2๊ฐ€์ง€ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ •๊ธฐ ์„œ๋น„์Šค์—์„œ๋Š” ๊ตํ™˜ ์ง€์ ์—์„œ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๊ณ  ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค. ๊ธด๊ธ‰ ์ƒํ™ฉ์—์„œ ๋ฉ”์‹œ์ง•์€ ์žฅ์•  ์กฐ์น˜ ์‹œ๋‚˜๋ฆฌ์˜ค ์ค‘ ํ•˜๋‚˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ฝค ๋ณต์žกํ•ด ๋ณด์ด์ง€๋งŒ ์ฝ”๋“œ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋ฌด์„ญ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ฃผ์„์ด ์žˆ๋Š” ์ฝ”๋“œ ์˜ˆ์ œ๋Š” ๋‚˜์ค‘์— ํ…œํ”Œ๋ฆฟ ๋ถ„์„์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

๊ตํ™˜

๊ตํ™˜ ์ง€์ ์€ ๋ฉ”์‹œ์ง• ํ…œํ”Œ๋ฆฟ ๋‚ด์˜ ๊ตฌ์„ฑ ์š”์†Œ์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ ๋…ผ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฉ”์‹œ์ง• ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ๋ชจ๋“  ์˜ˆ์—์„œ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋ฉ”์‹œ์ง•์„ ํ˜•์„ฑํ•˜๋Š” ์กฐํ•ฉ์ธ ๊ตํ™˜ ์ง€์ ์„ ํ†ตํ•ด ์ƒํ˜ธ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง€ ๊ตํ™˜ ํŒจํ„ด(MEP)

์ „ ์„ธ๊ณ„์ ์œผ๋กœ ๊ตํ™˜ ํŒจํ„ด์€ ์–‘๋ฉด๊ณผ ์ผ๋ฐฉ์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ž๋Š” ๋“ค์–ด์˜ค๋Š” ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์˜๋ฏธํ•˜์ง€๋งŒ ํ›„์ž๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜์—์„œ ์–‘๋ฐฉํ–ฅ ํŒจํ„ด์˜ ์ „ํ˜•์ ์ธ ์˜ˆ๋Š” ์š”์ฒญ-์‘๋‹ต ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ๊ณผ ์ˆ˜์ • ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

์š”์ฒญ-์‘๋‹ต ๋˜๋Š” RPC

RPC๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์„ ๋ฐ›์•„์•ผ ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์„ธ์Šค๋Š” ๋™์ผํ•œ ํ˜ธ์ŠคํŠธ ๋˜๋Š” ๋‹ค๋ฅธ ๋Œ€๋ฅ™์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ๋ฉ”์‹œ์ง•์„ ํ†ตํ•œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ ๋‹ค์ด์–ด๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.

๋ถ„์‚ฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋นŒ๋”ฉ ๋ธ”๋ก. ์ฒซ ๋ฒˆ์งธ ์ ‘๊ทผ๋ฒ•

๋ฉ”์‹œ์ง•์€ ์™„์ „ํžˆ ๋น„๋™๊ธฐ์‹์ด๋ฏ€๋กœ ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ๊ตํ™˜์€ 2๋‹จ๊ณ„๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

  1. ์š”์ฒญ ๋ณด๋‚ด๊ธฐ

    messaging:request(Exchange, ResponseMatchingTag, RequestDefinition, HandlerProcess).

    ๊ตํ™˜ โ€’ ๊ณ ์œ ํ•œ ๊ตํ™˜ ์ง€์  ์ด๋ฆ„
    ResponseMatchingTag โ€’ ์‘๋‹ต ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋กœ์ปฌ ๋ ˆ์ด๋ธ”. ์˜ˆ๋ฅผ ๋“ค์–ด, ์„œ๋กœ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ๋™์ผํ•œ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ๊ฐœ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
    ์š”์ฒญ ์ •์˜ โ€’ ์š”์ฒญ ๋ณธ๋ฌธ
    ์ฒ˜๋ฆฌ๊ธฐ ํ”„๋กœ์„ธ์Šค โ€’ ํ•ธ๋“ค๋Ÿฌ์˜ PID. ์ด ํ”„๋กœ์„ธ์Šค๋Š” ์„œ๋ฒ„์—์„œ ์‘๋‹ต์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

  2. ์‘๋‹ต ์ฒ˜๋ฆฌ

    handle_info(#'$msg'{exchange = EXCHANGE, tag = ResponseMatchingTag,message = ResponsePayload}, State)

    ์‘๋‹ต ํŽ˜์ด๋กœ๋“œ - ์„œ๋ฒ„ ์‘๋‹ต.

์„œ๋ฒ„์˜ ๊ฒฝ์šฐ ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค์Œ 2๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  1. ํ™˜์ „์†Œ ์ดˆ๊ธฐํ™”
  2. ์ˆ˜์‹  ์š”์ฒญ ์ฒ˜๋ฆฌ

์ด ํ…œํ”Œ๋ฆฟ์„ ์ฝ”๋“œ๋กœ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ์ •ํ™•ํ•œ ์‹œ๊ฐ„ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„ ์ฝ”๋“œ

์„œ๋น„์Šค API ์ •์˜๋ฅผ api.hrl๋กœ ์ด๋™ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

%% =====================================================
%%  entities
%% =====================================================
-record(time, {
  unixtime :: non_neg_integer(),
  datetime :: binary()
}).

-record(time_error, {
  code :: non_neg_integer(),
  error :: term()
}).

%% =====================================================
%%  methods
%% =====================================================
-record(time_req, {
  opts :: term()
}).
-record(time_resp, {
  result :: #time{} | #time_error{}
}).

time_controller.erl์—์„œ ์„œ๋น„์Šค ์ปจํŠธ๋กค๋Ÿฌ ์ •์˜

%% ะ’ ะฟั€ะธะผะตั€ะต ะฟะพะบะฐะทะฐะฝ ั‚ะพะปัŒะบะพ ะทะฝะฐั‡ะธะผั‹ะน ะบะพะด. ะ’ัั‚ะฐะฒะธะฒ ะตะณะพ ะฒ ัˆะฐะฑะปะพะฝ gen_server ะผะพะถะฝะพ ะฟะพะปัƒั‡ะธั‚ัŒ ั€ะฐะฑะพั‡ะธะน ัะตั€ะฒะธั.

%% ะธะฝะธั†ะธะฐะปะธะทะฐั†ะธั gen_server
init(Args) ->
  %% ะฟะพะดะบะปัŽั‡ะตะฝะธะต ะบ ั‚ะพั‡ะบะต ะพะฑะผะตะฝะฐ
  messaging:monitor_exchange(req_resp, ?EXCHANGE, default, self())
  {ok, #{}}.

%% ะพะฑั€ะฐะฑะพั‚ะบะฐ ัะพะฑั‹ั‚ะธั ะฟะพั‚ะตั€ะธ ัะฒัะทะธ ั ั‚ะพั‡ะบะพะน ะพะฑะผะตะฝะฐ. ะญั‚ะพ ะถะต ัะพะฑั‹ั‚ะธะต ะฟั€ะธั…ะพะดะธั‚, ะตัะปะธ ั‚ะพั‡ะบะฐ ะพะฑะผะตะฝะฐ ะตั‰ะต ะฝะต ะทะฐะฟัƒัั‚ะธะปะฐััŒ.
handle_info(#exchange_die{exchange = ?EXCHANGE}, State) ->
  erlang:send(self(), monitor_exchange),
  {noreply, State};

%% ะพะฑั€ะฐะฑะพั‚ะบะฐ API
handle_info(#time_req{opts = _Opts}, State) ->
  messaging:response_once(Client, #time_resp{
result = #time{ unixtime = time_utils:unixtime(now()), datetime = time_utils:iso8601_fmt(now())}
  });
  {noreply, State};

%% ะทะฐะฒะตั€ัˆะตะฝะธะต ั€ะฐะฑะพั‚ั‹ gen_server
terminate(_Reason, _State) ->
  messaging:demonitor_exchange(req_resp, ?EXCHANGE, default, self()),
  ok.

ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ

์„œ๋น„์Šค์— ์š”์ฒญ์„ ๋ณด๋‚ด๋ ค๋ฉด ํด๋ผ์ด์–ธํŠธ์˜ ์–ด๋””์—์„œ๋‚˜ ๋ฉ”์‹œ์ง• ์š”์ฒญ API๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

case messaging:request(?EXCHANGE, tag, #time_req{opts = #{}}, self()) of
    ok -> ok;
    _ -> %% repeat or fail logic
end

๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ตฌ์„ฑ์€ ๋งค์šฐ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์š”์ฒญ ์‹œ์ ์— ๋ฉ”์‹œ์ง•์ด ์•„์ง ์‹œ์ž‘๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์„œ๋น„์Šค ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฉ”์‹œ์ง• ์‘๋‹ต์„ ํ™•์ธํ•˜๊ณ  ์‹คํŒจ ์‚ฌ๋ก€๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํด๋ผ์ด์–ธํŠธ์— ์„ฑ๊ณต์ ์œผ๋กœ ์ „์†กํ•œ ํ›„ ์„œ๋น„์Šค๋Š” ์‘๋‹ต ๋˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.
handle_info์—์„œ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

handle_info(#'$msg'{exchange = ?EXCHANGE, tag = tag, message = #time_resp{result = #time{unixtime = Utime}}}, State) ->
  ?debugVal(Utime),
  {noreply, State};

handle_info(#'$msg'{exchange = ?EXCHANGE, tag = tag, message = #time_resp{result = #time_error{code = ErrorCode}}}, State) ->
  ?debugVal({error, ErrorCode}),
  {noreply, State};

์š”์ฒญ ์ฒญํฌ ์‘๋‹ต

ํฐ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์‹œ์Šคํ…œ์˜ ์‘๋‹ต์„ฑ๊ณผ ์•ˆ์ •์ ์ธ ์ž‘๋™์ด ์ด์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์‘๋‹ต์ด ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๋Š” ๊ฒฝ์šฐ ๋ถ„ํ• ์ด ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

๋ถ„์‚ฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋นŒ๋”ฉ ๋ธ”๋ก. ์ฒซ ๋ฒˆ์งธ ์ ‘๊ทผ๋ฒ•

๋‹ค์Œ์€ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์˜ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์ž…๋‹ˆ๋‹ค.

  • ๊ตฌ์„ฑ ์š”์†Œ๋Š” ํŒŒ์ผ๊ณผ ๊ฐ™์€ ์ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ต์„ ์ž‘์€ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„๋ฉด ๋ชจ๋“  ํฌ๊ธฐ์˜ ํŒŒ์ผ์—์„œ ํšจ์œจ์ ์œผ๋กœ ์ž‘์—…ํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ”Œ๋กœ๋ฅผ ํฌ์ฐฉํ•˜์ง€ ์•Š๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  • ๋ชฉ๋ก. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ฑฐ๋Œ€ํ•œ ํ…Œ์ด๋ธ”์—์„œ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ์„ ํƒํ•˜์—ฌ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๋Ÿฌํ•œ ๋ฐ˜์‘์„ ๊ธฐ๊ด€์ฐจ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  1024๊ฐœ์˜ 1MB ๋ฉ”์‹œ์ง€๊ฐ€ ๋‹จ์ผ 1GB ๋ฉ”์‹œ์ง€๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.

Erlang ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋Š” ์‘๋‹ต์ด ๊ตํ™˜ ์ง€์ ์„ ์šฐํšŒํ•˜์—ฌ ์ˆ˜์‹ ์ž์—๊ฒŒ ์ฆ‰์‹œ ์ „์†ก๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตํ™˜ ์ง€์ ๊ณผ ๋„คํŠธ์›Œํฌ์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๋Š” ์ถ”๊ฐ€ ์ด์ ์„ ์–ป์Šต๋‹ˆ๋‹ค.

์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต

์ด๊ฒƒ์€ ๋Œ€ํ™”ํ˜• ์‹œ์Šคํ…œ ๊ตฌ์ถ•์„ ์œ„ํ•œ RPC ํŒจํ„ด์˜ ๋‹ค์†Œ ๋“œ๋ฌธ ์ˆ˜์ •์ž…๋‹ˆ๋‹ค.

๋ถ„์‚ฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋นŒ๋”ฉ ๋ธ”๋ก. ์ฒซ ๋ฒˆ์งธ ์ ‘๊ทผ๋ฒ•

๋ฐœํ–‰-๊ตฌ๋…(๋ฐ์ดํ„ฐ ๋ถ„ํฌ ํŠธ๋ฆฌ)

์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋˜๋Š” ์ฆ‰์‹œ ์†Œ๋น„์ž์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹œ์Šคํ…œ์€ ํ’€ ๋˜๋Š” ํด ๋ชจ๋ธ๋ณด๋‹ค ํ‘ธ์‹œ ๋ชจ๋ธ์— ๋” ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์†์ ์œผ๋กœ ์š”์ฒญํ•˜๊ณ  ๋Œ€๊ธฐํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚ญ๋น„ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆผ์€ ํŠน์ • ์ฃผ์ œ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ์†Œ๋น„์ž์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋ถ„์‚ฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋นŒ๋”ฉ ๋ธ”๋ก. ์ฒซ ๋ฒˆ์งธ ์ ‘๊ทผ๋ฒ•

์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ์ „ํ˜•์ ์ธ ์˜ˆ๋Š” ์ปดํ“จํ„ฐ ๊ฒŒ์ž„์˜ ๊ฒŒ์ž„ ์„ธ๊ณ„, ๊ฑฐ๋ž˜์†Œ์˜ ์‹œ์žฅ ๋ฐ์ดํ„ฐ, ๋ฐ์ดํ„ฐ ํ”ผ๋“œ์˜ ์œ ์šฉํ•œ ์ •๋ณด์™€ ๊ฐ™์€ ์ƒํƒœ ๋ถ„ํฌ์ž…๋‹ˆ๋‹ค.

๊ตฌ๋…์ž ์ฝ”๋“œ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

init(_Args) ->
  %% ะฟะพะดะฟะธัั‹ะฒะฐะตะผัั ะฝะฐ ะพะฑะผะตะฝะฝะธะบ, ะบะปัŽั‡ = key
  messaging:subscribe(?SUBSCRIPTION, key, tag, self()),
  {ok, #{}}.

handle_info(#exchange_die{exchange = ?SUBSCRIPTION}, State) ->
  %% ะตัะปะธ ั‚ะพั‡ะบะฐ ะพะฑะผะตะฝะฐ ะฝะตะดะพัั‚ัƒะฟะฝะฐ, ั‚ะพ ะฟั‹ั‚ะฐะตะผัั ะฟะตั€ะตะฟะพะดะบะปัŽั‡ะธั‚ัŒัั
  messaging:subscribe(?SUBSCRIPTION, key, tag, self()),
  {noreply, State};

%% ะพะฑั€ะฐะฑะฐั‚ั‹ะฒะฐะตะผ ะฟั€ะธัˆะตะดัˆะธะต ัะพะพะฑั‰ะตะฝะธั
handle_info(#'$msg'{exchange = ?SUBSCRIPTION, message = Msg}, State) ->
  ?debugVal(Msg),
  {noreply, State};

%% ะฟั€ะธ ะพัั‚ะฐะฝะพะฒะบะต ะฟะพั‚ั€ะตะฑะธั‚ะตะปั - ะพั‚ะบะปัŽั‡ะฐะตะผัั ะพั‚ ั‚ะพั‡ะบะธ ะพะฑะผะตะฝะฐ
terminate(_Reason, _State) ->
  messaging:unsubscribe(?SUBSCRIPTION, key, tag, self()),
  ok.

์†Œ์Šค๋Š” ํŽธ๋ฆฌํ•œ ์œ„์น˜์—์„œ ๋ฉ”์‹œ์ง€ ๊ฒŒ์‹œ ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

messaging:publish_message(Exchange, Key, Message).

๊ตํ™˜ - ๊ตํ™˜ ์ง€์ ์˜ ์ด๋ฆ„,
ํ‚ค โ€’ ๋ผ์šฐํŒ… ํ‚ค
๋ณด๋‚ด์‹ค ๋‚ด์šฉ - ํŽ˜์ด๋กœ๋“œ

๋ฐ˜์ „ ๊ฒŒ์‹œ ๊ตฌ๋…

๋ถ„์‚ฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋นŒ๋”ฉ ๋ธ”๋ก. ์ฒซ ๋ฒˆ์งธ ์ ‘๊ทผ๋ฒ•

pub-sub๋ฅผ ๋ฐฐํฌํ•˜๋ฉด ๋กœ๊น…์— ํŽธ๋ฆฌํ•œ ํŒจํ„ด์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†Œ์Šค์™€ ์†Œ๋น„์ž ์„ธํŠธ๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ทธ๋ฆผ์€ ํ•œ ๋ช…์˜ ์†Œ๋น„์ž์™€ ์—ฌ๋Ÿฌ ์†Œ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ž‘์—… ๋ถ„ํฌ ํŒจํ„ด

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

3๊ฐœ์˜ ํ•ธ๋“ค๋Ÿฌ์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ์ž‘์—… ๋ฐฐ๋ถ„ ๋‹จ๊ณ„์—์„œ๋„ ๋ฐฐ๋ถ„์˜ ๊ณต์ •์„ฑ๊ณผ ์ฒ˜๋ฆฌ๊ธฐ์˜ ๊ณผ์ž‰์— ๋Œ€ํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ผ์šด๋“œ ๋กœ๋นˆ ๋ถ„๋ฐฐ๋Š” ๊ณต์ •์„ฑ์„ ์ฑ…์ž„์งˆ ๊ฒƒ์ด๋ฉฐ, ํ•ธ๋“ค๋Ÿฌ์˜ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์ƒํ™ฉ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ œํ•œ์„ ๋„์ž…ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋ฆฌํŽ˜์น˜_ํ•œ๊ณ„. ์ „ํ™˜ ๋ชจ๋“œ์—์„œ ํ”„๋ฆฌํŽ˜์น˜_ํ•œ๊ณ„ ํ•˜๋‚˜์˜ ์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜์‹ ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง•์€ ๋Œ€๊ธฐ์—ด๊ณผ ์ฒ˜๋ฆฌ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์„œ๋Š” ์ž‘์—…์ด ๋„์ฐฉํ•˜๋ฉด ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜๊ฑฐ๋‚˜ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • messaging:ack(Tack) โ€’ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ์„ฑ๊ณต ์‹œ ํ˜ธ์ถœ
  • messaging:nack(Tack) โ€’ ๋ชจ๋“  ๋น„์ƒ ์ƒํ™ฉ์—์„œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ž‘์—…์ด ๋ฐ˜ํ™˜๋œ ํ›„ ๋ฉ”์‹œ์ง•์€ ์ž‘์—…์„ ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ๊ธฐ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

๋ถ„์‚ฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋นŒ๋”ฉ ๋ธ”๋ก. ์ฒซ ๋ฒˆ์งธ ์ ‘๊ทผ๋ฒ•

์„ธ ๊ฐ€์ง€ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ ๋ณต์žกํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌ๊ธฐ 1์ด ์ž‘์—…์„ ๋ฐ›์€ ํ›„ ๊ตํ™˜ ์ง€์ ์— ์•„๋ฌด ๊ฒƒ๋„ ๋ณด๊ณ ํ•  ์‹œ๊ฐ„๋„ ์—†์ด ์ถฉ๋Œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๊ตํ™˜ ์ง€์ ์€ ack ์‹œ๊ฐ„ ์ œํ•œ์ด ๋งŒ๋ฃŒ๋œ ํ›„ ์ž‘์—…์„ ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ๊ธฐ๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌ๊ธฐ 3์€ ์–ด๋–ค ์ด์œ ๋กœ ์ž‘์—…์„ ํฌ๊ธฐํ•˜๊ณ  nack์„ ๋ณด๋ƒˆ๊ณ , ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ž‘์—…์€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒํ•œ ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ๊ธฐ๋กœ ์ „๋‹ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋น„ ์š”์•ฝ

์šฐ๋ฆฌ๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ๊ธฐ๋ณธ ๋นŒ๋”ฉ ๋ธ”๋ก์„ ๋ถ„ํ•ดํ•˜๊ณ  Erlang/Elixir์—์„œ์˜ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ์ดํ•ด๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ์„ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ณต์žกํ•œ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๊ตฌ์ถ•ํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์˜ ๋.

ะคะพั‚ะพ ๋งˆ๋ฆฌ์šฐ์Šค ํฌ๋ฆฌ์Šคํ…์Šจ
์‚ฝํ™” ์ œ๊ณต: websequencediagrams.com

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€