๋ฐ๋“œ๋ฝ ์˜ˆ๋ฐฉ๊ณผ SQS ๋„์ž…

2chan
  • #deadlock
  • #sqs
  • #inventory
  • #queue
  • #์žฌ๊ณ 
  • #event

๋“ค์–ด๊ฐ€๋ฉฐ

์•ˆ๋…•ํ•˜์„ธ์š”. ์›๋”์›” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ด์ฐฌํฌ์ž…๋‹ˆ๋‹ค.

์ด๋ฒˆ ํฌ์ŠคํŠธ๋Š” 1ํŽธ์ธ ๋ฐ๋“œ๋ฝ์˜ ๋ฐœ์ƒ ์›์ธ ์— ์ด์–ด์„œ ์ž‘์„ฑ๋˜๋‹ˆ ๋จผ์ € ์ฝ๊ณ ์™€์ฃผ์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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


ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ๋ณ€๊ฒฝ

๊ธฐ์กด์˜ ๋ฐ๋“œ๋ฝ ๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ํ…Œ์ด๋ธ” inventory๋ฅผ ๋งŒ๋“ค๊ณ  ๊ธฐ์กด์— product ํ…Œ์ด๋ธ”์— ์žˆ๋˜ sold_count(ํŒ๋งค์ˆ˜๋Ÿ‰), max_count(์žฌ๊ณ ) ์ปฌ๋Ÿผ์„ inventory ํ…Œ์ด๋ธ”๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” 1ํŽธ์—์„œ ๋‚˜์˜จ ๊ธฐ์กด api์˜ ๋™์ž‘์ž…๋‹ˆ๋‹ค.

  1. ์ฃผ๋ฌธ ์ƒ์„ฑ api - order ํ…Œ์ด๋ธ”์— insert ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ฃผ๋ฌธ ์™„๋ฃŒ api - product ํ…Œ์ด๋ธ”์˜ sold_count๋ฅผ update ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ product ํ…Œ์ด๋ธ”์˜ sold_count๋ฅผ inventory๋กœ ์˜ฎ๊ธฐ๊ฒŒ ๋œ๋‹ค๋ฉด ์•„๋ž˜ ๋‚ด์šฉ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ฃผ๋ฌธ ์™„๋ฃŒ api์—์„œ product ํ…Œ์ด๋ธ”์— sold_count๋ฅผ updateํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๊ฐ™์€ product_id์— ๋Œ€ํ•œ order insert / product update๊ฐ€ ๊ฒน์น˜์ง€ ์•Š์•„ ๋ฐ๋“œ๋ฝ์„ ์—๋ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

inventory ํ…Œ์ด๋ธ”์— sold_count๋ฅผ updateํ•˜๋Š” ๋ถ€๋ถ„์ด ์ถ”๊ฐ€๋˜๊ธด ํ•˜์ง€๋งŒ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๊ณ  SQS๋ฅผ ๋„์ž…ํ•˜์—ฌ ์•ˆ์ •์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ํ•˜์˜€์Šต๋‹ˆ๋‹ค.


SQS ๋„์ž…๊ณผ ๊ตฌํ˜„

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

ํŒ๋งค์ˆ˜๋Ÿ‰ ์—…๋ฐ์ดํŠธ์™€ ํ’ˆ์ ˆ์ฒ˜๋ฆฌ ๋กœ์ง์€ ๊ฐ Queue๋ฅผ ๊ตฌ๋…ํ•˜๋Š” Lambda๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  1. ์œ ์ €๊ฐ€ ์ฃผ๋ฌธ ์ƒ์„ฑ๋ถ€ํ„ฐ ์ฃผ๋ฌธ ์™„๋ฃŒ๊นŒ์ง€์˜ ๋กœ์ง์ž…๋‹ˆ๋‹ค. ์ฃผ๋ฌธ ์ƒ์„ฑ/์™„๋ฃŒ์— ๋Œ€ํ•œ ๋กœ์ง๋งŒ ์‹คํ–‰ํ•˜๋ฉฐ, ์ฃผ๋ฌธ ์™„๋ฃŒ ์ดํ›„ UpdateSoldCountQueue์— event๋ฅผ ์ „์†กํ•˜๊ณ  OrderLambda๋Š” ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

  2. UpdateSoldCountQueue: ํŒ๋งค๋œ inventory์˜ id์™€ sold_count ์ •๋ณด๋ฅผ ๊ฐ€์ง€๋Š” queue

  3. UpdateSoldCountLambda: UpdateSoldCountQueue๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” lambda function์ž…๋‹ˆ๋‹ค. UpdateSoldCountQueue๋กœ ์ด๋ฒคํŠธ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ๊ทธ๊ฒƒ์„ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด ์™€ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ inventory_id์™€ sold_count๋ฅผ ๋ฐ›์•„ ์ˆ˜๋Ÿ‰ ์ฆ๊ฐ€ ๋กœ์ง์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  4. ๋งŒ์•ฝ UpdateSoldCountLambda์—์„œ sold_count๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ๋Š”๋ฐ max_count๋ฅผ ์ดˆ๊ณผํ–ˆ๋‹ค๋ฉด, UpdateSoldOutQueue์— ํ’ˆ์ ˆ๋œ product์˜ ์ •๋ณด event๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. UpdateSoldOutQueue๋Š” ํ’ˆ์ ˆ๋œ product์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  5. UpdateSoldOutLambda: UpdateSoldOutQueue๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” lambda function์ž…๋‹ˆ๋‹ค. UpdateSoldOutQueue๋กœ ์ด๋ฒคํŠธ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ๊ทธ๊ฒƒ์„ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด ์™€ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ product_id๋ฅผ ๋ฐ›์•„ db์— ํ’ˆ์ ˆ์ฒ˜๋ฆฌ ๋กœ์ง์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Admin์—์„œ๋„ ๊ธฐ์กด product์˜ max_count๋ฅผ ์ฆ๊ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”๋ฐ์š”, ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ UpdateSoldCountQueue๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ max_count๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„ ๊ณผ์ •์„ ๊ฑฐ์นจ์œผ๋กœ์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ฐ ๋กœ์ง์„ ์ˆ˜์ •ํ•  ๋•Œ ์„œ๋กœ ์‹ ๊ฒฝ์“ธ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  2. ํŠน์ • ํ์˜ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๋‹ค๋ฅธ ํ๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  3. ๋กœ๊ทธ๋ฅผ ๊ฐ๊ฐ ๋ณผ ์ˆ˜ ์žˆ์–ด ํŠธ๋ž˜ํ‚น์— ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์น˜๋ฉฐ

์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ๋ฐ๋“œ๋ฝ ์˜ˆ๋ฐฉ๊ณผ SQS์˜ ๋„์ž…์— ๋Œ€ํ•ด ๋‹ค๋ค˜์Šต๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์€ ๊ณ ๊ฐ ์‹ ๋ขฐ๋„๋ฅผ ๋†’์ด๊ณ  ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์˜ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๋ฐ ํฐ ์žฅ์ ์ด ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์•ˆ์ •์„ฑ์€ SQS์˜ ์ค‘์š”ํ•œ ์ด์  ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

โ† ๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

Art Changes Life

๋…ธ๋จธ์Šค์™€ ํ•จ๊ป˜ ์—”ํ„ฐํ…Œํฌ ์‚ฐ์—…์„ ํ˜์‹ ํ•ด๋‚˜๊ฐˆ ๋ฉค๋ฒ„๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

์ฑ„์šฉ ์ค‘์ธ ๊ณต๊ณ  ๋ณด๊ธฐ