Redis Atomic Lock ๊ธฐ๋ฐ Idempotency ๊ตฌํ์ ํตํ ์ค๋ณต ๊ฒฐ์ ๋ฐ ๋ฐ์ดํฐ ์ค์ผ ์์ฒ ์ฐจ๋จ
Defeating Webhook Storms: Idempotency in Laravel ๐
AI ์์ฝ
Context
๋ถ์ฐ ์์คํ ํ๊ฒฝ์์ Webhook ์ ์ก ์ ๋ฐ์ํ๋ Network Latency์ Vendor์ Retry ๋ฉ์ปค๋์ฆ์ผ๋ก ์ธํ ์ค๋ณต ์ฒ๋ฆฌ ์ํ ์กด์ฌ. ํนํ ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ ์๊ฐ์ด Vendor์ Timeout ์๊ณ์น(3์ด)๋ฅผ ์ด๊ณผํ ๊ฒฝ์ฐ ๋ฐ์ํ๋ ์ค๋ณต ๊ณผ๊ธ ๋ฐ ๋ฐ์ดํฐ ์ ํฉ์ฑ ํ๊ดด ๋ฌธ์ ํด๊ฒฐ ํ์.
Technical Solution
- Vendor ์ ๊ณต ๊ณ ์ Event ID๋ฅผ Idempotency Key๋ก ํ์ฉํ์ฌ ์์ฒญ์ ์ ์ผ์ฑ ์๋ณ
- API Controller์์ ๋น์ฆ๋์ค ๋ก์ง์ Queue Worker๋ก ์์ํ์ฌ ์๋ต ์๊ฐ์ 50ms ๋ฏธ๋ง์ผ๋ก ๋จ์ถํ๊ณ Timeout ๋ฐฉ์ง
- Redis์ Atomic Lock์ ํตํด ๋์ผ Event ID์ ๋ํ ๋์์ฑ ์ ์ด๋ฅผ ์ํํ์ฌ ์ค๋ณต ์คํ ์์ฒ ์ฐจ๋จ
- ์ฒ๋ฆฌ ์๋ฃ๋ Event ID๋ฅผ ์บ์์ 30์ผ๊ฐ ๊ธฐ๋กํ์ฌ ์ฅ๊ธฐ์ ์ธ ๊ด์ ์ ์ค๋ณต ์์ฒญ ํํฐ๋ง ๊ตฌ์กฐ ์ค๊ณ
- Try-Catch ๋ธ๋ก ๋ด Lock Release ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ์ฌ ๋ก์ง ์คํจ ์์๋ง Retry๊ฐ ๊ฐ๋ฅํ๋๋ก ๊ฐ์ฉ์ฑ ํ๋ณด
์ค์ฒ ํฌ์ธํธ
1. ์ธ๋ถ API ์ฐ๋ ์ Vendor๊ฐ ์ ๊ณตํ๋ ๊ณ ์ ID๋ฅผ Idempotency Key๋ก ์ฌ์ฉํ๋์ง ํ์ธ
2. ๋ฌด๊ฑฐ์ด ๋น์ฆ๋์ค ๋ก์ง์ API ์๋ต ๊ฒฝ๋ก์์ ๋ถ๋ฆฌํ์ฌ Queue ๊ธฐ๋ฐ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๊ตฌ์กฐ๋ก ์ค๊ณ
3. ๋ถ์ฐ ๋ฝ(Distributed Lock) ์ ์ฉ ์ ์ฒ๋ฆฌ ์คํจ ์ํฉ์ ๋๋นํ Lock Release ์ ๋ต ์๋ฆฝ
4. ์ฒ๋ฆฌ ์๋ฃ ์ํ๋ฅผ ์ ์ฅํ๋ TTL(Time-To-Live) ๊ธฐ๊ฐ์ ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ ๋ง์ถฐ ์ค์