AWS SQSλ₯Ό μ΄μš©ν•˜μ—¬ ν…Œλ„ŒνŠΈ 별 비동기 μž‘μ—… μ€„μ„Έμš°κΈ°

2025. 2. 2. 16:47γ†κΈ°μˆ μ  κ³ λ―Ό

졜근 νšŒμ‚¬μ—μ„œ 진행 쀑인 μž‘μ—…μ—μ„œ μ•„λž˜μ™€ 같은 μš”κ΅¬μ‚¬ν•­μ„ λ§Œλ‚˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

  • μ„œλΉ„μŠ€ λ‚΄μ—λŠ” 수 λ§Žμ€ ν…Œλ„ŒνŠΈκ°€ 쑴재
  • 각 ν…Œλ„ŒνŠΈ λ‚΄μ—μ„œλŠ” νŠΉμ • μ΄λ²€νŠΈκ°€ λ°œμƒν•˜κ³ , 이λ₯Ό μ²˜λ¦¬ν•˜λŠ” μ›Œμ»€ 둜직이 ν•„μš” (ν•œλ²ˆ 싀행에 500ms ~ 5s, ν…Œλ„ŒνŠΈ λ‚΄ 데이터 양에 λΉ„λ‘€)
  • 이벀트 λ°œμƒ λΉˆλ„λŠ” 높지 μ•ŠμŒ
  • 이 λ•Œ 이듀 μ›Œμ»€ λ‘œμ§μ€ ν…Œλ„ŒνŠΈ λ³„λ‘œ μ˜€λ‘œμ§€ ν•˜λ‚˜μ”©λ§Œ λ™μž‘ν•΄μ•Ό 함. (ν…Œλ„ŒνŠΈ λ‚΄ λ™μ‹œμ„± X)

ν•΄λ‹Ή κΈ€μ—μ„œλŠ” 이 μš”κ΅¬μ‚¬ν•­μ„ λ§Œμ‘±μ‹œν‚€κΈ° μœ„ν•œ λ°©μ•ˆμ— λŒ€ν•΄ 닀뀄보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

졜초 κ΅¬ν˜„

μ΄ˆκΈ°μ—λŠ” 이 μš”κ΅¬μ‚¬ν•­μ„ λ§Œμ‘±μ‹œν‚€κΈ° μœ„ν•΄, μ•„λž˜μ™€ 같은 λ°©ν–₯μ„±μœΌλ‘œ μž‘μ—…μ„ μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. 각 ꡬ쑰에 λŒ€ν•œ μ„€λͺ…은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

image

  • μ„œλ²„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” μœ μ €μ˜ νŠΉμ • 행동에 따라 이벀트λ₯Ό λ°œν–‰ν•˜μ—¬ SQS둜 μ „λ‹¬ν•©λ‹ˆλ‹€.
  • μ „λ‹¬λœ μ΄λ²€νŠΈλŠ” 사전에 λ“±λ‘λœ AWS λžŒλ‹€λ₯Ό νŠΈλ¦¬κ±°ν•˜μ—¬ μ†ŒλΉ„λ©λ‹ˆλ‹€.
  • 이 λ•Œ λžŒλ‹€μ—μ„œλŠ” μž‘μ—…μ— μ•žμ„œ, ν…Œλ„ŒνŠΈ 별 μœ μΌμ„±μ„ 보μž₯ν•˜κΈ° μœ„ν•΄ ν…Œλ„ŒνŠΈ μ‹λ³„μžλ₯Ό ν†΅ν•œ 뢄산락을 μš”μ²­ν•©λ‹ˆλ‹€. 이 λ•Œ 뢄산락은 Mysql의 Named Lock을 톡해 κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  • Named Lock을 λŒ€κΈ°ν•˜λ‹€κ°€ μ΅œλŒ€ λŒ€κΈ° μ‹œκ°„(10s)을 λ„˜μ–΄κ°€λŠ” μΌ€μ΄μŠ€λŠ” DLQλ₯Ό 톡해 큐에 λ‹€μ‹œ 넣어주도둝 κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

졜초 κ΅¬ν˜„ λ°©μ‹μ˜ 문제

μœ„μ²˜λŸΌ κ΅¬ν˜„ν•˜κ³ λ‚˜λ‹ˆ 크게 두가지 λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

μ²«λ²ˆμ§ΈλŠ” λΉ„μš© λ¬Έμ œμž…λ‹ˆλ‹€.

μœ„ κ΅¬μ‘°μ—μ„œλŠ” μ΄λ²€νŠΈκ°€ 큐에 λ“€μ–΄κ°€κ³  λ‚˜λ©΄ 일단 λžŒλ‹€λ₯Ό λ„μš°κ³  κ±°κΈ°μ—μ„œ 뢄산락을 λŒ€κΈ°ν•˜λ©° ν…Œλ„ŒνŠΈ 별 λ™μ‹œμ„±μ„ μ œμ–΄ν•©λ‹ˆλ‹€. λžŒλ‹€μ˜ κ²½μš°μ—” μ‹€μ œ μ‹€ν–‰μ‹œκ°„μ— λΉ„λ‘€ν•˜μ—¬ λΉ„μš©μ΄ λ°œμƒν•˜κΈ° λ•Œλ¬Έμ—, μ‹€μ œ 둜직의 λ™μž‘ 외에 λΆˆν•„μš”ν•˜κ²Œ 락을 λŒ€κΈ°ν•˜λŠ” μ‹œκ°„μ΄ λͺ¨λ‘ λΉ„μš©μ— ν¬ν•¨λ˜κ²Œ λ©λ‹ˆλ‹€. μ΄λ²€νŠΈκ°€ μŠ€νŒŸμ„±μœΌλ‘œ 많이 λ°œμƒν•˜λŠ” μƒν™©μ—μ„œλŠ” 단 10초 κ°„ 싀행될 수 μžˆλŠ” 만큼의 이벀트만 μ†ŒλΉ„λ˜κ³ , λ‚˜λ¨Έμ§€ μ΄λ²€νŠΈλ“€μ€ μ „λΆ€ 10초 κ°„ λŒ€κΈ° ν›„ μž¬μ‹œλ„ν•˜κ²Œ λ˜λŠ”λ° λ™μ‹œμ„± μ œμ–΄λ₯Ό μœ„ν•œ 락 λŒ€κΈ°μ— 거의 λͺ¨λ“  μ‹œκ°„μ΄ μ†ŒλΉ„λ˜μ–΄ λΉ„μš©μ μΈ μΈ‘λ©΄μ—μ„œ μ—„μ²­λ‚œ λ‚­λΉ„κ°€ λ°œμƒν•©λ‹ˆλ‹€.

λ‘λ²ˆμ§ΈλŠ” 혼작 μ œμ–΄ λ¬Έμ œμž…λ‹ˆλ‹€.

μœ„ κ΅¬μ‘°μ—μ„œλŠ” λ™μ‹œμ— λ°œμƒν•œ μ΄λ²€νŠΈλ“€ 쀑, 락을 νšλ“ν•œ 단 ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ œμ™Έν•˜λ©΄ μž¬μ‹œλ„ λ‹¨κ³„μ—μ„œ κ·ΈλŒ€λ‘œ λ™μΌν•œ κ²½μŸμžλ“€κ³Ό 경합이 λ°œμƒν•©λ‹ˆλ‹€. μ΄λŠ” μœ„μ—μ„œ μ–ΈκΈ‰ν•œ λΉ„μš© 문제λ₯Ό λ”μš± μ‹¬ν™”μ‹œν‚΅λ‹ˆλ‹€.

κ°œμ„ λœ κ΅¬ν˜„ λ°©μ•ˆ

λ‹€μŒμ€ 졜초 κ΅¬ν˜„μ—μ„œ λ°œμƒν•˜λ˜ 문제λ₯Ό ν•΄μ†Œν•œ κ΅¬μ‘°μž…λ‹ˆλ‹€. 적용된 μ•„μ΄λ””μ–΄λŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

image

  • 각 μ΄λ²€νŠΈλ“€μ€ 이벀트 νŽ˜μ΄λ‘œλ“œ 내에 μ΅œλŒ€ μž¬μ‹œλ„ 횟수λ₯Ό κ°–μŠ΅λ‹ˆλ‹€.
  • 이벀트둜 인해 트리거된 λžŒλ‹€ μ›Œμ»€μ—μ„œ 뢄산락 νšλ“μ„ μ‹œλ„λŠ” ν•˜λ‚˜, λŒ€κΈ°λŠ” ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • 뢄산락 νšλ“μ— μ‹€νŒ¨ν•œ μ΄λ²€νŠΈλ“€μ€ νŽ˜μ΄λ‘œλ“œ λ‚΄ μž¬μ‹œλ„ 횟수λ₯Ό ν•˜λ‚˜ κ°μ†Œμ‹œν‚¨μ±„ 큐에 λ‹€μ‹œ λ°€μ–΄λ„£μŠ΅λ‹ˆλ‹€.
  • 이 λ•Œ SQS Delay Seconds μ˜΅μ…˜μ„ λ„μž…ν•˜μ—¬ 뢄산락 νšλ“ ν”„λ‘œμ„ΈμŠ€μ˜ 둜직이 λλ‚œ λ’€ λžŒλ‹€μ— 전달될 수 μžˆλ„λ‘ 텀을 κ°€μ§‘λ‹ˆλ‹€.
  • μž¬μ‹œλ„ νšŸμˆ˜κ°€ λŠ˜μ–΄λ‚ μˆ˜λ‘ ν˜„μž¬ ν•΄λ‹Ή ν…Œλ„ŒνŠΈμ— λŒ€ν•œ μ΄λ²€νŠΈκ°€ μ „λ°˜μ μœΌλ‘œ ν˜Όμž‘ν•œ 것이기 λ•Œλ¬Έμ—, μž¬μ‹œλ„ νšŸμˆ˜κ°€ λŠ˜μ–΄λ‚ μˆ˜λ‘ λŒ€κΈ° μ‹œκ°„μ΄ μ§€μˆ˜μ μœΌλ‘œ μ¦κ°€ν•˜λŠ” ExponentialBackoffλ₯Ό λ„μž…ν•˜μ—¬ Delay Secondsλ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
  • λͺ¨λ“  μ‹€νŒ¨ μ΄λ²€νŠΈλ“€μ΄ λ™μΌν•œ Delay Secondsλ₯Ό κ°€μ§ˆ 경우 λ‹€μŒ νŽ˜μ΄μ¦ˆμ—μ„œ λ™μΌν•˜κ²Œ κ²½μŸν•  것이기 λ•Œλ¬Έμ—, Backoff μ‹œκ°„μ„ 계산할 λ•Œ λžœλ€μ„±μ„ μΆ”κ°€ν•©λ‹ˆλ‹€.
  • 이전 방식에 λΉ„ν•΄ 평균 μž¬μ‹œλ„ νšŸμˆ˜κ°€ λŠ˜μ–΄λ‚  것이기 λ•Œλ¬Έμ— μ΅œλŒ€ μž¬μ‹œλ„ 횟수λ₯Ό λ„‰λ„‰ν•˜κ²Œ 주도둝 ν•˜κ³ , μ΅œλŒ€ μž¬μ‹œλ„ 횟수λ₯Ό λ„˜μ€ κ²½μš°μ—” DLQλ₯Ό 톡해 κ°œλ°œμžλ“€μ΄ μ•Œ 수 있게 ν•©λ‹ˆλ‹€.

μΆ”κ°€μ μœΌλ‘œ κ³ λ―Ό ν•΄λ³Ό λ‚΄μš©

μœ„μ™€ 같이 κ°œμ„ μ μ„ λ°˜μ˜ν•œ 뒀에도 더 λ‚˜μ€ 방식이 μ—†μ„κΉŒ ν•˜κ³  λ¦¬μ„œμΉ˜λ₯Ό κ³„μ†ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

그리고 ν˜„μž¬κΉŒμ§€ ν™•μΈν•œ λ‚΄μš© 쀑 κ°€μž₯ μ μš©ν•΄λ΄„μ§ν•œ λ°©μ•ˆμ€ λ°”λ‘œ SQS의 λ©”μ‹œμ§€ κ·Έλ£Ή κΈ°λŠ₯을 μ΄μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

SQS의 λ©”μ‹œμ§€ 그룹은 μ‰½κ²Œ λ§ν•˜λ©΄ SQS λ‚΄λΆ€μ—μ„œ FIFOλ₯Ό 보μž₯ν•˜λŠ” μ΅œμ†Œ λ‹¨μœ„μΈλ°μš”. λ©”μ‹œμ§€ κ·Έλ£Ή IDλ₯Ό ν…Œλ„ŒνŠΈ μ‹λ³„μžλ‘œ μ‚¬μš©ν•˜λŠ” 방법을 μ΄μš©ν•˜λ©΄ "ν…Œλ„ŒνŠΈ 별 λ™μ‹œμ„±" μš”κ΅¬μ‚¬ν•­μ„ μ‰½κ²Œ μΆ©μ‘±ν•  수 μžˆμ–΄λ³΄μž…λ‹ˆλ‹€.

λ‹€λ§Œ FIFO와 기쑴에 μ‚¬μš©ν•˜λ˜ StandardλŠ” Trade off둜 μž‘μš©ν•˜λŠ” ꡬ간듀이 μ‘΄μž¬ν•˜λŠ”λ°, 이에 λŒ€ν•œ 검증이 아직은 λΆ€μ‘±ν•˜μ—¬ λ„μž…μ„ λͺ»ν•΄λ³΄κ³  μžˆλŠ” μƒν™©μž…λ‹ˆλ‹€.

μ°Έκ³