βš™οΈ

SidekiqλŠ” μ–΄λ–»κ²Œ λ™μž‘ν•˜λ‚˜?

Redis 기반 λ°±κ·ΈλΌμš΄λ“œ 작 큐 μ‹œμŠ€ν…œ

SidekiqλŠ” Ruby의 λŒ€ν‘œμ μΈ λ°±κ·ΈλΌμš΄λ“œ 작 ν”„λ‘œμ„Έμ„œμž…λ‹ˆλ‹€. μ›Ή μš”μ²­ 쀑 μ‹œκ°„μ΄ 였래 κ±Έλ¦¬λŠ” μž‘μ—…μ„ Redis 큐에 μ§λ ¬ν™”λœ 작으둜 λ„£μœΌλ©΄(perform_async), λ³„λ„μ˜ Sidekiq μ›Œμ»€ ν”„λ‘œμ„ΈμŠ€κ°€ λ©€ν‹°μŠ€λ ˆλ“œλ‘œ νμ—μ„œ μž‘μ„ κΊΌλ‚΄ μ²˜λ¦¬ν•©λ‹ˆλ‹€. μ›Ή ν”„λ‘œμ„ΈμŠ€λŠ” μ¦‰μ‹œ 응닡을 λ°˜ν™˜ν•  수 있고, μ‹€μ œ μž‘μ—…μ€ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ΄λ€„μ§‘λ‹ˆλ‹€. μ‹€νŒ¨ν•œ μž‘μ€ μžλ™ μž¬μ‹œλ„λ˜λ©°, Dead μƒνƒœλ‘œ λΉ μ§„ μž‘μ€ μ›Ή UIμ—μ„œ λͺ¨λ‹ˆν„°λ§ κ°€λŠ₯ν•©λ‹ˆλ‹€.

ꡬ쑰 λ‹€μ΄μ–΄κ·Έλž¨

🌐
Web Process
Rails / Puma
MyWorker.perform_async(id)
β‘  LPUSH (enqueue)
πŸ—„οΈ
Redis
queue:default queue:mailers retry set dead set
β‘‘ BRPOP (dequeue)
βš™οΈ
Sidekiq Worker
λ©€ν‹°μŠ€λ ˆλ“œ ν”„λ‘œμ„ΈμŠ€
Thread 1: 이메일 Thread 2: 인코딩 Thread 3: λŒ€κΈ°
μ‹€νŒ¨ μ‹œ μž¬μ‹œλ„ 흐름:
μ‹€νŒ¨ retry 큐 (exponential backoff) 25회 μž¬μ‹œλ„ Dead 큐
핡심 포인트
  • μ›Ή ν”„λ‘œμ„ΈμŠ€μ™€ μ›Œμ»€ ν”„λ‘œμ„ΈμŠ€λŠ” 별도 ν”„λ‘œμ„ΈμŠ€ (같은 μ½”λ“œλ² μ΄μŠ€)
  • Redisκ°€ 큐 μ—­ν•  — μž‘μ€ JSON으둜 직렬화
  • BRPOP: 큐가 λΉ„μ–΄μžˆμœΌλ©΄ λΈ”λ‘œν‚Ή λŒ€κΈ° (폴링 μ•„λ‹˜)
  • μ›Œμ»€λŠ” λ©€ν‹°μŠ€λ ˆλ“œλ‘œ λ™μ‹œμ— μ—¬λŸ¬ 작 처리

λ™μž‘ 흐름

1

μ›Ή μš”μ²­μ—μ„œ MyWorker.perform_async(args) 호좜

2

작 정보가 JSON으둜 μ§λ ¬ν™”λ˜μ–΄ Redis 큐에 LPUSH

3

Sidekiq μ›Œμ»€ ν”„λ‘œμ„ΈμŠ€κ°€ Redisμ—μ„œ BRPOP으둜 작 꺼냄

4

μ›Œμ»€κ°€ perform(args) λ©”μ„œλ“œ μ‹€ν–‰ (별도 μŠ€λ ˆλ“œ)

5

성곡 μ‹œ 작 제거, μ‹€νŒ¨ μ‹œ retry 큐둜 이동 (exponential backoff)

6

μ΅œλŒ€ μž¬μ‹œλ„ 초과 μ‹œ Dead 큐둜 이동 (μˆ˜λ™ 확인 ν•„μš”)

μž₯점

  • μ›Ή 응닡 속도 κ°œμ„  (무거운 μž‘μ—… 뢄리)
  • μžλ™ μž¬μ‹œλ„ (exponential backoff)
  • λ©€ν‹°μŠ€λ ˆλ“œλ‘œ 높은 μ²˜λ¦¬λŸ‰
  • Sidekiq Web UI둜 λͺ¨λ‹ˆν„°λ§

단점

  • Redis 의쑴 (Redis λ‹€μš΄ = 작 처리 쀑단)
  • 작 직렬화 μ œμ•½ (λ³΅μž‘ν•œ 객체 전달 λΆˆκ°€)
  • λ©€ν‹°μŠ€λ ˆλ“œ μ•ˆμ „μ„± 주의
  • 쀑볡 μ‹€ν–‰ κ°€λŠ₯μ„± (λ©±λ“±μ„± ν•„μš”)

μ‚¬μš© 사둀

이메일/μ•Œλ¦Ό λ°œμ†‘ 이미지/λ™μ˜μƒ 인코딩 μ™ΈλΆ€ API 호좜 (결제, 배솑) CSV/PDF λŒ€λŸ‰ 생성 데이터 동기화/정리