Build to scale: queueing and latency on Twilio

Nova | ๊น€์ธํ›„ยท2025๋…„ 5์›” 10์ผ
post-thumbnail

๐Ÿ”— ์›๋ณธ ๋ฌธ์„œ: Build to scale: queueing and latency on Twilio


๐Ÿงจ ์‹œ๋‚˜๋ฆฌ์˜ค: ๋ธ”๋ž™ ํ”„๋ผ์ด๋ฐ์ด ๋Œ€๋ž€ ๋Œ€๋น„ํ•˜๊ธฐ

11์‹œ์— 1000๊ฐœ์˜ ์ƒํ’ˆ์ด ํ• ์ธ ์˜คํ”ˆ! ์ด ์†Œ์‹์„ ์˜ค์ „ 10์‹œ์— 100๋งŒ ๋ช…์—๊ฒŒ ํ•œ๊บผ๋ฒˆ์— ๋ฌธ์ž๋กœ ์•Œ๋ ค์•ผ ํ•œ๋‹ค๋ฉด?

  • 10์‹œ: ํ”„๋กœ๋ชจ์…˜ ๋ฌธ์ž (๋งํฌ ํฌํ•จ)
  • ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž… ํ›„: OTP ๋ฌธ์ž ์ธ์ฆ

์ด๋ ‡๊ฒŒ ๋‘ ์ข…๋ฅ˜์˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด, ๊ฐ ์œ ์Šค์ผ€์ด์Šค๋งˆ๋‹ค ๋ณ„๋„์˜ ๋ฉ”์‹œ์ง• ์„œ๋น„์Šค(Messaging Service) ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ด์š”.


๐Ÿ“ฆ ๋ฉ”์‹œ์ง• ์„œ๋น„์Šค(Messaging Service)๋ž€?

๋ฉ”์‹œ์ง• ์„œ๋น„์Šค๋Š” ์—ฌ๋Ÿฌ ๋ฐœ์‹ ๋ฒˆํ˜ธ(๋ฐœ์‹ ์ž ํ’€) ์™€ ์„ค์ •๊ฐ’์„ ํ•˜๋‚˜์˜ ๋ชฉ์ ์— ๋งž๊ฒŒ ๋ฌถ์€ ๋‹จ์œ„์˜ˆ์š”. ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด:

  • ๋ฐœ์‹ ์ž ๊ด€๋ฆฌ ์ž๋™ํ™”
  • Opt-Out ์ฒ˜๋ฆฌ
  • ๋‹ค๊ตญ๊ฐ€ ๋Œ€์‘ ์„ค์ •

๋“ฑ์„ ์†์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด์š”.

โš ๏ธ ๋‹จ, ์—ฌ๋Ÿฌ ๋ฒˆํ˜ธ๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฑด ์ง€์—ญ ๊ทœ์ œ์— ๋”ฐ๋ผ ์ œํ•œ๋  ์ˆ˜ ์žˆ์–ด์š”. ํŠนํžˆ ๋ฏธ๊ตญ์—์„œ๋Š” "์Šค๋…ธ์šฐ์Šˆ์ž‰(snowshoeing)"์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ Twilio ์ •์ฑ… ํ™•์ธ ํ•„์ˆ˜!


๐Ÿ’ก ๋ฉ”์‹œ์ง€ ๋ฐœ์†ก ํ๋ฆ„ (์š”์ฒญ โ†’ ๋ฐœ์†ก)

  1. ๋ฉ”์‹œ์ง• ์„œ๋น„์Šค๋กœ API ์š”์ฒญ ์ „์†ก
  2. ์„œ๋น„์Šค๊ฐ€ ํ์— ์ €์žฅํ•˜๊ณ  ์ ์ ˆํ•œ ๋ฐœ์‹ ์ž ์„ ํƒ
  3. ํ†ต์‹ ์‚ฌ(Carrier)๋กœ ์ „๋‹ฌ
  4. ์ตœ์ข… ์ˆ˜์‹ ์ž์—๊ฒŒ ๋„์ฐฉ

โœ… ์œ ์Šค์ผ€์ด์Šค์— ๋งž๊ฒŒ ์„ค๊ณ„ํ•˜๊ธฐ

๊ตฌ๋ถ„์œ ์Šค์ผ€์ด์Šค๋ฉ”์‹œ์ง€ ์ˆ˜๊ธด๊ธ‰๋„๊ถŒ์žฅ Validity Period
ํ”„๋กœ๋ชจ์…˜๋งํฌ ํฌํ•จ ๋งˆ์ผ€ํŒ… ๋ฉ”์‹œ์ง€1,000,000๋‚ฎ์Œ๊ธฐ๋ณธ๊ฐ’ (10์‹œ๊ฐ„)
OTP๋กœ๊ทธ์ธ ์ธ์ฆ ์ฝ”๋“œ์•ฝ 20,000๋†’์Œ2~3๋ถ„ (์˜ˆ: 120์ดˆ)

๐Ÿ“ˆ ํ ์‚ฌ์ด์ฆˆ์™€ MPS ๊ณ„์‚ฐ๋ฒ•

  • ๊ธฐ๋ณธ ํ ๊ฐ€๋Šฅ ์‹œ๊ฐ„: 10์‹œ๊ฐ„ (36,000์ดˆ)
  • MPS (Messages Per Second) = ๋ฉ”์‹œ์ง€ ์ˆ˜ รท ํ ์‹œ๊ฐ„
  • Twilio ๊ถŒ์žฅ: ์•ˆ์ „ํ•˜๊ฒŒ 2๋ฐฐ ๋ฒ„ํผ ์ ์šฉ

์˜ˆ์‹œ ๊ณ„์‚ฐ

ํ”„๋กœ๋ชจ์…˜

  • 1M รท 36,000์ดˆ = 27.7 โ†’ ๋ฒ„ํผ ์ ์šฉ ์‹œ 60 MPS ํ•„์š”

OTP

  • 20,000 รท 180์ดˆ = 111 โ†’ ๋ฒ„ํผ ์ ์šฉ ์‹œ 220 MPS ํ•„์š”

๐Ÿ›  ๋ฉ”์‹œ์ง• ์„œ๋น„์Šค ์ƒ์„ฑ ์˜ˆ์‹œ (OTP์šฉ)

const service = await client.messaging.v1.services.create({
  friendlyName: "My OTP Messaging Service",
  validityPeriod: 120
});

๐Ÿ”ข ๋ฐœ์‹ ์ž(Pool) ๊ตฌ์„ฑ ์˜ˆ์‹œ

ํ”„๋กœ๋ชจ์…˜์šฉ

๋ฒˆํ˜ธ ํƒ€์ž…์ˆ˜๋Ÿ‰๊ฐœ๋ณ„ MPS์ด MPS
์ˆ์ฝ”๋“œ1100100
์˜๊ตญ ์žฅ๋ฒˆํ˜ธ21020
๋ฏธ๊ตญ ์žฅ๋ฒˆํ˜ธ10110
์บ๋‚˜๋‹ค ์žฅ๋ฒˆํ˜ธ10110
ํ•ฉ๊ณ„23140

OTP์šฉ

๋ฒˆํ˜ธ ํƒ€์ž…์ˆ˜๋Ÿ‰๊ฐœ๋ณ„ MPS์ด MPS
์ˆ์ฝ”๋“œ1100100
ํ†จํ”„๋ฆฌ22550
์˜๊ตญ ์žฅ๋ฒˆํ˜ธ41040
๋ฏธ๊ตญ ์žฅ๋ฒˆํ˜ธ10110
์บ๋‚˜๋‹ค ์žฅ๋ฒˆํ˜ธ21020
ํ•ฉ๊ณ„19220

โฑ ์บ ํŽ˜์ธ ํƒ€์ด๋ฐ ์ „๋žต

  • ํ”„๋กœ๋ชจ์…˜ ๋ฉ”์‹œ์ง€: ์˜ค์ „ ์ค‘ ๋ฏธ๋ฆฌ ํ์— ์˜ฌ๋ ค๋‘๊ธฐ
  • OTP: ์‚ฌ์šฉ์ž ํ–‰๋™ ๋ฐœ์ƒ ์‹œ ์‹ค์‹œ๊ฐ„ ๋ฐœ์†ก
const message = await client.messages.create({
  body: "์„ธ์ผ 1์‹œ๊ฐ„ ์ „! ๋กœ๊ทธ์ธํ•˜์„ธ์š”!",
  messagingServiceSid: "MGxxx",
  to: "+821012345678"
});

๐Ÿ“Š ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง: Messaging Insights

  • Latency Report: ๋ฉ”์‹œ์ง€๊ฐ€ Twilio์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” ์‹œ๊ฐ„
  • Delivery & Errors Report: ์ „์†ก ์„ฑ๊ณต๋ฅ , ์‹คํŒจ ์›์ธ ํŒŒ์•…
  • ๊ฐ ๋ฐœ์‹ ์ž/์„œ๋น„์Šค/๊ณ„์ • ๋‹จ์œ„๋กœ ํ™•์ธ ๊ฐ€๋Šฅ

โš ๏ธ ์˜ค๋ฅ˜ ์˜ˆ์‹œ: Queue Overflow, 30001 ๋“ฑ โ†’ ๋ฐฑ์˜คํ”„ + ์žฌ์‹œ๋„ ๋กœ์ง ํ•„์š”


๐Ÿšจ ๊ธด๊ธ‰ ์ƒํ™ฉ ๋Œ€์‘

๋Œ€๊ทœ๋ชจ ์žฅ์• ๋‚˜ ๊ณต์ง€ ํ•„์š” ์‹œ, ๊ธฐ์กด ํ•œ๋„ ์ดˆ๊ณผ๋  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Ÿด ๋• Twilio ์ง€์›ํŒ€์— ํ•œ๋„ ์ƒํ–ฅ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์–ด์š”.


๐Ÿ“Ž ์ฐธ๊ณ  ๋ฆฌ์†Œ์Šค

0๊ฐœ์˜ ๋Œ“๊ธ€