Skip to main content
SonamuλŠ” 비동기 λ°±κ·ΈλΌμš΄λ“œ μž‘μ—…μ„ μ²˜λ¦¬ν•˜λŠ” Workflow μ‹œμŠ€ν…œμ„ μ œκ³΅ν•©λ‹ˆλ‹€. κΈ΄ μž‘μ—…μ„ λ°±κ·ΈλΌμš΄λ“œλ‘œ λΆ„λ¦¬ν•˜μ—¬ API 응닡 속도λ₯Ό κ°œμ„ ν•˜κ³ , Worker ν”„λ‘œμ„ΈμŠ€λ‘œ μž‘μ—…μ„ λΆ„μ‚° μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

기본 ꡬ쑰

enableWorker

Worker ν”„λ‘œμ„ΈμŠ€λ₯Ό ν™œμ„±ν™”ν• μ§€ κ²°μ •ν•©λ‹ˆλ‹€. νƒ€μž…: boolean (선택적) κΈ°λ³Έκ°’: false
Workerλž€?
  • 별도 ν”„λ‘œμ„ΈμŠ€μ—μ„œ μž‘μ—…μ„ 처리
  • 메인 API μ„œλ²„μ— 영ν–₯ μ—†μŒ
  • μ—¬λŸ¬ Workerλ₯Ό μ‹€ν–‰ν•˜μ—¬ λΆ„μ‚° 처리 κ°€λŠ₯
ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œλŠ” enableWorker: true둜 μ„€μ •ν•˜μ—¬ Worker μ „μš© ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•˜λŠ” 것을 ꢌμž₯ν•©λ‹ˆλ‹€.

ν™˜κ²½ λ³€μˆ˜λ‘œ μ œμ–΄

.env:

workerOptions

Worker의 λ™μž‘ 방식을 μ„€μ •ν•©λ‹ˆλ‹€. νƒ€μž…: WorkflowOptions (선택적)

concurrency

Workerκ°€ λ™μ‹œμ— μ²˜λ¦¬ν•  μž‘μ—… μˆ˜μž…λ‹ˆλ‹€. νƒ€μž…: number κΈ°λ³Έκ°’: 1
ꢌμž₯κ°’:
  • 1 - λ‹¨μˆœν•œ μž‘μ—…, 순차 처리 ν•„μš”
  • 2-5 - 일반적인 λ°±κ·ΈλΌμš΄λ“œ μž‘μ—…
  • 10+ - κ°€λ²Όμš΄ I/O μœ„μ£Ό μž‘μ—…
concurrencyλ₯Ό 높이면 더 λ§Žμ€ μž‘μ—…μ„ λ™μ‹œμ— μ²˜λ¦¬ν•˜μ§€λ§Œ, CPU와 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ μ¦κ°€ν•©λ‹ˆλ‹€.

usePubSub

닀쀑 Worker κ°„ μž‘μ—… 뢄산을 μœ„ν•΄ Pub/Sub을 μ‚¬μš©ν•©λ‹ˆλ‹€. νƒ€μž…: boolean κΈ°λ³Έκ°’: true
λ™μž‘ 방식:
  • false: 각 Workerκ°€ λ…λ¦½μ μœΌλ‘œ μž‘μ—… 풀링
  • true: PostgreSQL LISTEN/NOTIFY둜 μƒˆ μž‘μ—… μ•Œλ¦Όμ„ μ¦‰μ‹œ μ „νŒŒ
Pub/Sub은 PostgreSQL의 λ‚΄μž₯ LISTEN/NOTIFY λ©”μ»€λ‹ˆμ¦˜μ„ μ‚¬μš©ν•˜λ―€λ‘œ, λ³„λ„μ˜ 인프라(Redis λ“±) μ„€μΉ˜κ°€ ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이미 κ΅¬μ„±λœ λ°μ΄ν„°λ² μ΄μŠ€ 연결을 κ·ΈλŒ€λ‘œ ν™œμš©ν•©λ‹ˆλ‹€.

listenDelay

μž‘μ—…μ„ ν™•μΈν•˜λŠ” μ£ΌκΈ°(λ°€λ¦¬μ΄ˆ)μž…λ‹ˆλ‹€. νƒ€μž…: number (ms) κΈ°λ³Έκ°’: 500 (0.5초)
ꢌμž₯κ°’:
  • 100-500ms - λΉ λ₯Έ 응닡이 ν•„μš”ν•œ μž‘μ—…
  • 500-1000ms - 일반적인 λ°±κ·ΈλΌμš΄λ“œ μž‘μ—…
  • 1000-5000ms - κΈ΄κΈ‰ν•˜μ§€ μ•Šμ€ μž‘μ—…

contextProvider

Workerμ—μ„œ μ‹€ν–‰λ˜λŠ” μž‘μ—…μ˜ Contextλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. νƒ€μž…: (defaultContext) => Context | Promise<Context>
defaultContext 포함 ν•„λ“œ:
  • reply - Fastify reply 객체 (null in worker)
  • request - Fastify request 객체 (null in worker)
  • headers - μš”μ²­ 헀더
  • createSSE - SSE 슀트림 생성
  • naiteStore - Naite λ‘œκΉ… μŠ€ν† μ–΄

μ»€μŠ€ν…€ Context

Worker Contextμ—μ„œλŠ” request와 replyκ°€ nullμž…λ‹ˆλ‹€. HTTP κ΄€λ ¨ κΈ°λŠ₯은 μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

κΈ°λ³Έ μ˜ˆμ‹œ

단일 Worker (개발)

닀쀑 Worker (ν”„λ‘œλ•μ…˜)

μ‹€μ „ μ˜ˆμ‹œ

ν™˜κ²½λ³„ μ„€μ •

κ³ λΆ€ν•˜ μ›Œν¬ν”Œλ‘œμš°

μ»€μŠ€ν…€ Context

Workflow μ‚¬μš©

tasks μ„€μ • ν›„ workflow() ν•¨μˆ˜λ‘œ λ°±κ·ΈλΌμš΄λ“œ μž‘μ—…μ„ μ •μ˜ν•©λ‹ˆλ‹€.
호좜:
β†’ Workflow μ‚¬μš©λ²•

Worker μ‹€ν–‰

개발 ν™˜κ²½

개발 ν™˜κ²½μ—μ„œλŠ” enableWorker: false둜 두고 메인 ν”„λ‘œμ„ΈμŠ€μ—μ„œ 처리:

ν”„λ‘œλ•μ…˜ ν™˜κ²½

Worker μ „μš© ν”„λ‘œμ„ΈμŠ€λ₯Ό λ³„λ„λ‘œ μ‹€ν–‰:
package.json:

닀쀑 Worker

μ—¬λŸ¬ Workerλ₯Ό μ‹€ν–‰ν•˜μ—¬ μ²˜λ¦¬λŸ‰ 증가:
PM2λ‚˜ Dockerλ₯Ό μ‚¬μš©ν•˜λ©΄ μ—¬λŸ¬ Workerλ₯Ό μ‰½κ²Œ 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

Pub/Sub λ™μž‘ 방식

usePubSub: true(κΈ°λ³Έκ°’)일 λ•Œ, WorkerλŠ” PostgreSQL의 λ‚΄μž₯ LISTEN/NOTIFY λ©”μ»€λ‹ˆμ¦˜μ„ μ‚¬μš©ν•˜μ—¬ μƒˆ μž‘μ—… μ•Œλ¦Όμ„ μˆ˜μ‹ ν•©λ‹ˆλ‹€. λ³„λ„μ˜ λ©”μ‹œμ§€ 브둜컀(Redis λ“±)κ°€ ν•„μš”ν•˜μ§€ μ•ŠμœΌλ©°, 이미 κ΅¬μ„±λœ λ°μ΄ν„°λ² μ΄μŠ€ 연결을 κ·ΈλŒ€λ‘œ ν™œμš©ν•©λ‹ˆλ‹€.

μ£Όμ˜μ‚¬ν•­

1. Worker Context μ œν•œ

2. enableWorker μ„€μ •

3. concurrency κ³Όλ‹€ μ„€μ •

λ‹€μŒ 단계

Task 섀정을 μ™„λ£Œν–ˆλ‹€λ©΄:
  • workflows - Workflow μ •μ˜ν•˜κΈ°
  • steps - Step으둜 μž‘μ—… 뢄리
  • error-handling - μ—λŸ¬ 처리 및 μž¬μ‹œλ„