๋ฐ๋๋ฝ ์๋ฐฉ๊ณผ SQS ๋์
- #deadlock
- #sqs
- #inventory
- #queue
- #์ฌ๊ณ
- #event
๋ค์ด๊ฐ๋ฉฐ
์๋ ํ์ธ์. ์๋์ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ์ด์ฐฌํฌ์ ๋๋ค.
์ด๋ฒ ํฌ์คํธ๋ 1ํธ์ธ ๋ฐ๋๋ฝ์ ๋ฐ์ ์์ธ ์ ์ด์ด์ ์์ฑ๋๋ ๋จผ์ ์ฝ๊ณ ์์ฃผ์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
1ํธ์์๋ ์ฌ๊ณ ์ฒ๋ฆฌ ๋ก์ง์์ ๋ฐ์ํ๋ ๋ฐ๋๋ฝ์ ์์ธ์ ๋ํด ์์๋ดค์๋๋ฐ์, ์ด๋ฒ ํฌ์คํธ์์๋ ์๋กญ๊ฒ ํ๋กฌ์คํ ์ด๋ฅผ ๊ฐ๋ฐํ๋ฉฐ ๋ฐ๋๋ฝ์ ์๋ฐฉํ๊ณ ์ฌ๊ณ ๋ฅผ ์์ ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ์์ ํ๋ ๋ด์ฉ์ ์ค๋ช ๋๋ฆฌ๋๋ก ํ๊ฒ ์ต๋๋ค.
ํ ์ด๋ธ ๊ตฌ์กฐ ๋ณ๊ฒฝ
๊ธฐ์กด์ ๋ฐ๋๋ฝ ๋ฌธ์ ๋ฅผ ์๋ฐฉํ๊ธฐ ์ํด ์๋ก์ด ํ ์ด๋ธ inventory๋ฅผ ๋ง๋ค๊ณ ๊ธฐ์กด์ product ํ ์ด๋ธ์ ์๋ sold_count(ํ๋งค์๋), max_count(์ฌ๊ณ ) ์ปฌ๋ผ์ inventory ํ ์ด๋ธ๋ก ์ฎ๊ฒผ์ต๋๋ค.
์๋๋ 1ํธ์์ ๋์จ ๊ธฐ์กด api์ ๋์์ ๋๋ค.
- ์ฃผ๋ฌธ ์์ฑ api - order ํ ์ด๋ธ์ insert ํฉ๋๋ค.
- ์ฃผ๋ฌธ ์๋ฃ api - product ํ ์ด๋ธ์ sold_count๋ฅผ update ํฉ๋๋ค.
์ฌ๊ธฐ์ product ํ ์ด๋ธ์ sold_count๋ฅผ inventory๋ก ์ฎ๊ธฐ๊ฒ ๋๋ค๋ฉด ์๋ ๋ด์ฉ์ ๊ธฐ๋ํ ์ ์์ต๋๋ค.
- ์ฃผ๋ฌธ ์๋ฃ api์์ product ํ ์ด๋ธ์ sold_count๋ฅผ updateํ๋ ๊ณผ์ ์ด ํ์ํ์ง ์์ต๋๋ค.
- ์ด๋ ๊ฒ ๋๋ฉด ๊ฐ์ product_id์ ๋ํ order insert / product update๊ฐ ๊ฒน์น์ง ์์ ๋ฐ๋๋ฝ์ ์๋ฐฉํ ์ ์์ต๋๋ค.
inventory ํ ์ด๋ธ์ sold_count๋ฅผ updateํ๋ ๋ถ๋ถ์ด ์ถ๊ฐ๋๊ธด ํ์ง๋ง ๋ก์ง์ ๋ถ๋ฆฌํ๊ณ SQS๋ฅผ ๋์ ํ์ฌ ์์ ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ๋ ํ์์ต๋๋ค.
SQS ๋์ ๊ณผ ๊ตฌํ
ํ ์ด๋ธ์ ๋ถ๋ฆฌํ์ฌ ๋ฐ๋๋ฝ์ ์๋ฐฉํ์์ง๋ง, ์์ง ํ๋์ ํจ์์ ์ฃผ๋ฌธ, ์ฌ๊ณ ์ฒ๋ฆฌ(ํ๋งค์๋ ์ ๋ฐ์ดํธ, ํ์ ์ฒ๋ฆฌ)๊ฐ ๋ชจ๋ ํฌํจ๋์ด ์์ด ํธ๋์ญ์ ๋ด์์ ์ฒ๋ฆฌํ๋ ๋ก์ง์ด ๋ง์ต๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด ๊ฐ์ ์์์ ๋์์ ํ๋ํ๋ ค๊ณ ํ๋ ์ํฉ์ด ์๋๋๋ผ๋ ๊ธด ํธ๋์ญ์ ์ด ๋๋๊ธฐ๋ฅผ ๋๊ธฐํ๋ค๊ฐ ๋ฐ๋๋ฝ์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ ์ฌ์ ํ ์กด์ฌํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฃผ๋ฌธ์ ์์ ์ฑ์ ์ํด ์ฃผ๋ฌธ, ์ฌ๊ณ ์ฒ๋ฆฌ(ํ๋งค์๋ ์ ๋ฐ์ดํธ, ํ์ ์ฒ๋ฆฌ) ๋ก์ง์ ๋ชจ๋ ๋ถ๋ฆฌํ์์ต๋๋ค.
ํ๋งค์๋ ์ ๋ฐ์ดํธ์ ํ์ ์ฒ๋ฆฌ ๋ก์ง์ ๊ฐ Queue๋ฅผ ๊ตฌ๋ ํ๋ Lambda๊ฐ ์ฒ๋ฆฌํ๋๋ก ๊ตฌํํ์์ต๋๋ค.
-
์ ์ ๊ฐ ์ฃผ๋ฌธ ์์ฑ๋ถํฐ ์ฃผ๋ฌธ ์๋ฃ๊น์ง์ ๋ก์ง์ ๋๋ค. ์ฃผ๋ฌธ ์์ฑ/์๋ฃ์ ๋ํ ๋ก์ง๋ง ์คํํ๋ฉฐ, ์ฃผ๋ฌธ ์๋ฃ ์ดํ UpdateSoldCountQueue์ event๋ฅผ ์ ์กํ๊ณ OrderLambda๋ ์ข ๋ฃ๋ฉ๋๋ค.
-
UpdateSoldCountQueue: ํ๋งค๋ inventory์ id์ sold_count ์ ๋ณด๋ฅผ ๊ฐ์ง๋ queue
-
UpdateSoldCountLambda: UpdateSoldCountQueue๋ฅผ ๊ตฌ๋ ํ๊ณ ์๋ lambda function์ ๋๋ค. UpdateSoldCountQueue๋ก ์ด๋ฒคํธ๊ฐ ๋ค์ด์ค๋ฉด ๊ทธ๊ฒ์ ํ๋์ฉ ๊บผ๋ด ์ ์คํํ๊ฒ ๋๋๋ฐ inventory_id์ sold_count๋ฅผ ๋ฐ์ ์๋ ์ฆ๊ฐ ๋ก์ง์ ์คํํฉ๋๋ค.
-
๋ง์ฝ UpdateSoldCountLambda์์ sold_count๋ฅผ ์ ๋ฐ์ดํธํ๋๋ฐ max_count๋ฅผ ์ด๊ณผํ๋ค๋ฉด, UpdateSoldOutQueue์ ํ์ ๋ product์ ์ ๋ณด event๋ฅผ ์ ์กํฉ๋๋ค. UpdateSoldOutQueue๋ ํ์ ๋ product์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
-
UpdateSoldOutLambda: UpdateSoldOutQueue๋ฅผ ๊ตฌ๋ ํ๊ณ ์๋ lambda function์ ๋๋ค. UpdateSoldOutQueue๋ก ์ด๋ฒคํธ๊ฐ ๋ค์ด์ค๋ฉด ๊ทธ๊ฒ์ ํ๋์ฉ ๊บผ๋ด ์ ์คํํ๊ฒ ๋๋๋ฐ product_id๋ฅผ ๋ฐ์ db์ ํ์ ์ฒ๋ฆฌ ๋ก์ง์ ์คํํฉ๋๋ค.
Admin์์๋ ๊ธฐ์กด product์ max_count๋ฅผ ์ฆ๊ฐ์ํฌ ์ ์๋๋ฐ์, ๋ง์ฐฌ๊ฐ์ง๋ก UpdateSoldCountQueue๋ฅผ ํธ์ถํ์ฌ max_count๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์ ๊ณผ์ ์ ๊ฑฐ์นจ์ผ๋ก์ ์๋์ ๊ฐ์ ์ด์ ์ ์ป์ ์ ์์์ต๋๋ค.
- ๊ฐ ๋ก์ง์ ์์ ํ ๋ ์๋ก ์ ๊ฒฝ์ธ ํ์๊ฐ ์์ต๋๋ค.
- ํน์ ํ์ ์๋ฌ๊ฐ ๋ฐ์ํด๋ ๋ค๋ฅธ ํ๊ฐ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.
- ๋ก๊ทธ๋ฅผ ๊ฐ๊ฐ ๋ณผ ์ ์์ด ํธ๋ํน์ ์ฉ์ดํฉ๋๋ค.
๋ง์น๋ฉฐ
์ด๋ฒ ํฌ์คํธ์์๋ ๋ฐ๋๋ฝ ์๋ฐฉ๊ณผ SQS์ ๋์ ์ ๋ํด ๋ค๋ค์ต๋๋ค.
SQS๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๊ณ ์ฒ๋ฆฌ์ ๊ฐ์ ์ค์ํ ์์ ์ ์์ ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์ ๋ณด๊ฐ ์์ ํ๊ฒ ํ๋ก ์ด๋ํ๊ณ ์ฒ๋ฆฌ๋๋ฏ๋ก ๋ฐ์ดํฐ๊ฐ ์์ค๋๊ฑฐ๋ ์ค๋ณต ์ฒ๋ฆฌ๋์ง ์์ต๋๋ค. ๋ํ ์์คํ ์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋๋ผ๋ SQS๋ ๋ฉ์์ง๋ฅผ ์์ ํ๊ฒ ๋ณด๊ดํ๊ณ ์์คํ ์ด ํ๋ณต๋๋ฉด ์ฒ๋ฆฌ๋ฅผ ๊ณ์ํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๊ณ ๊ฐ ์ ๋ขฐ๋๋ฅผ ๋์ด๊ณ ์ฃผ๋ฌธ ์ฒ๋ฆฌ ์์คํ ์ ์์ ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ํฐ ์ฅ์ ์ด ๋ฉ๋๋ค. ์ด๋ฌํ ์์ ์ฑ์ SQS์ ์ค์ํ ์ด์ ์ค ํ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ฌํฉ๋๋ค.