์ด๋ฒคํŠธ

์ด๋ฒคํŠธ๊ฐ€ ์™œ(Why) ํ•„์š”ํ• ๊นŒ์š”?

Example

์‡ผํ•‘๋ชฐ์—์„œ ๊ตฌ๋งค๋ฅผ ์ทจ์†Œํ•˜๋ฉด?

  • ํ™˜๋ถˆ ์ฒ˜๋ฆฌ๋ฅผ ์ง„ํ–‰ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ™˜๋ถˆ ์ฒ˜๋ฆฌ ์„œ๋น„์Šค๊ฐ€ Exception์ด ๋ฐœ์ƒํ•œ๋‹ค๋ฉด?

  • ์ง„ํ–‰ํ–ˆ๋˜ ํ™˜๋ถˆ ์ฒ˜๋ฆฌ๋ฅผ ์ทจ์†Œ(Rollback) ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ™˜๋ถˆ ์ฒ˜๋ฆฌ๋Š” ์ง„ํ–‰(Commit)ํ•˜๊ณ  ํ™˜๋ถˆ ์ฒ˜๋ฆฌ๋ฅผ ์žฌ์‹œ๋„(Retry)๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™˜๋ถˆ ์ฒ˜๋ฆฌ ์„œ๋น„์Šค๊ฐ€ ๋Šฆ๊ฒŒ ์‘๋‹ตํ•œ๋‹ค๋ฉด?

  • ํ™˜๋ถˆ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์™ธ๋ถ€ ์‹œ์Šคํ…œ์˜ ์‘๋‹ต ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๋ฉด ๊ทธ๋งŒํผ CancelOrderService๋Š” ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • CancelOrderService์˜ ์„ฑ๋Šฅ์€ RefundService์— ์˜์กด์ ์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ทจ์†Œ ์„œ๋น„์Šค์— ๊ธฐ๋Šฅ์„ ๋” ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด?

  • ์ทจ์†Œ ์„œ๋น„์Šค์— E-Mail์„ ํ†ตํ•ด ์ทจ์†Œ ์•Œ๋ฆผ์„ ๋ฐ›๊ณ  ์‹ถ์€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด ์ทจ์†Œ ์„œ๋น„์Šค๋Š” RefundService, NotiService์— ์˜์กด์ ์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์ทจ์†Œ ์„œ๋น„์Šค๋Š” ์ทจ์†Œ, ์•Œ๋ฆผ, ํ™˜๋ถˆ ๋กœ์ง์ด ์„ž์ด๊ฒŒ ๋˜๊ณ . ๋ฌธ์ œ๋Š” ๋” ๋ณต์žกํ•ด ์ง‘๋‹ˆ๋‹ค.
    • ํ™˜๋ถˆ์€ ์„ฑ๊ณตํ–ˆ์ง€๋งŒ, ์•Œ๋ฆผ์ด ์‹คํŒจํ–ˆ๋‹ค๋ฉด?

Bounded Context ๊ฐ„์˜ ๊ฐ•๊ฒฐํ•ฉ(High Coupling)

  • ์ทจ์†Œ, ์•Œ๋ฆผ, ํ™˜๋ถˆ์ด ๋ชจ๋‘ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์‹œ์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด?

Bounded Context ๊ฐ„์˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•ด Event๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ์ ์œผ๋กœ Processing ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ๋Š” ์–ด๋””(Where)์— ์“ฐ์ผ๊นŒ์š”?

  • Trigger
    • ์ฃผ๋ฌธ์˜ ๊ฒฝ์šฐ ์ฃผ๋ฌธ ์ทจ์†Œ ์ด๋ฒคํŠธ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ํ™˜๋ถˆ ์„œ๋น„์Šค๋Š” ์ฃผ๋ฌธ ์ทจ์†Œ ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”
    • ๋ฐฐ์†ก์ง€ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ ๋ฐœ์ƒ
      • ์™ธ๋ถ€ ๋ฐฐ์†ก ๋ฐฐ์†ก์ง€ ๋ณ€๊ฒฝ
      • ๋‚ด๋ถ€ ๋ฐฐ์†ก ๋ฐฐ์†ก์ง€ ๋ณ€๊ฒฝ

๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

  • ๋กœ์ปฌ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰
  • ์ด๋ฒคํŠธ ์ €์žฅ์†Œ์™€ ์ด๋ฒคํŠธ ํฌ์›Œ๋” ์‚ฌ์šฉ
    • Polling
    • ์™ธ๋ถ€์— ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹
    • ์ด๋ฒคํŠธ ์ถ”์  ๋ฐ์ดํ„ฐ ํฌ์›Œ๋”์— ์ €์žฅ
  • ์ด๋ฒคํŠธ ์ €์žฅ์†Œ์™€ ์ด๋ฒคํŠธ ์ œ๊ณต API ์‚ฌ์šฉ
    • Interrupt
    • ํ•ธ๋“ค๋Ÿฌ๊ฐ€ API ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹
    • ์ด๋ฒคํŠธ ์ถ”์  ์™ธ๋ถ€ ํ•ธ๋“ค๋Ÿฌ์— ์ €์žฅ
  • ๋ฉ”์‹œ์ง€ ํ ์‚ฌ์šฉ
    • RabbitMQ : Global Transaction ์ง€์›๊ณผ ํ•จ๊ป˜ ํด๋Ÿฌ์Šคํ„ฐ์™€ HA ์ง€์›
    • Kafka : Global Transaction ์ง€์› X, ๋‹ค๋ฅธ Message Queue๋ณด๋‹ค ๋†’์€ ์„ฑ๋Šฅ

Global Transaction

  • ํ•„์š”ํ•˜๋‹ค๋ฉด ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒํ•˜๋Š” ๋„๋ฉ”์ธ ๊ธฐ๋Šฅ๊ณผ ๋ฉ”์‹œ์ง€ ํ์— ์ด๋ฒคํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” ์ ˆ์ฐจ๋ฅผ ํ•œ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์–ด์•ผ ํ•œ๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ ์œ„ํ•ด์„  Global Transcation์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ ์šฉ ์‹œ ๊ณ ๋ ค์‚ฌํ•ญ

  • ์ด๋ฒคํŠธ ์†Œ์Šค ์ž์ฒด๋ฅผ ์ด๋ฒคํŠธ์— ์ถ”๊ฐ€ํ• ์ง€ ์—ฌ๋ถ€
  • ์ด๋ฒคํŠธ ์ „์†ก ์‹คํŒจ๋ฅผ ์–ผ๋งˆ๋‚˜ ํ—ˆ์šฉํ•  ๊ฒƒ์ธ์ง€
  • ์ด๋ฒคํŠธ ์†์‹ค
  • ์ด๋ฒคํŠธ ์ˆœ์„œ
  • ์ด๋ฒคํŠธ ์žฌ์ฒ˜๋ฆฌ(๋ฉฑ๋“ฑ์„ฑ)

Etc

Publisher - Subscribe Pattern

Advantages

  • ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„(Loose coupling)
  • ํ™•์žฅ์„ฑ(Scalability)

Disadvantages

  • ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค.
  • Topic ๋ณ‘๋ชฉ ํ˜„์ƒ

Slide

Reference