Skip to content

Hatchet

๐Ÿช“ Run Background Tasks at Scale

Postgres์— ๊ธฐ๋ฐ˜ํ•œ ์ž‘์—… ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ”Œ๋žซํผ

About

  • Postgres ๊ธฐ๋ฐ˜์˜ ๋Œ€๊ทœ๋ชจ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—… ์ฒ˜๋ฆฌ ํ”Œ๋žซํผ ์˜คํ”ˆ์†Œ์Šค
  • ๋ถ„์‚ฐ ์ž‘์—… ํ(Distributed Task Queue) ๋ฐ ์›Œํฌํ”Œ๋กœ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ”Œ๋žซํผ
  • ๋ณต์žกํ•œ ์ž‘์—… ์›Œํฌํ”Œ๋กœ, ์‹คํŒจ ๋ณต๊ตฌ, ์Šค์ผ€์ค„๋ง, ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํŠธ๋ฆฌ๊ฑฐ, ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง๊นŒ์ง€ ์ง€์›
  • Python, Go, TypeScript SDK ์ œ๊ณต
  • MIT ๋ผ์ด์„ ์Šค, ์…€ํ”„ ํ˜ธ์ŠคํŒ… ๋ฐ ํด๋ผ์šฐ๋“œ ๋ฒ„์ „ ์ œ๊ณต

์ฃผ์š” ๊ธฐ๋Šฅ ์š”์•ฝ

  • ํ ๊ด€๋ฆฌ
    • Postgres ๊ธฐ๋ฐ˜ ๋‚ด๊ตฌ์„ฑ ์žˆ๋Š” ํ ์‹œ์Šคํ…œ
      • ํ‚ค ๊ธฐ๋ฐ˜ ํ์ž‰ (๊ณต์ •ํ•œ ์ž‘์—… ๋ถ„๋ฐฐ ๊ตฌํ˜„)
      • ์†๋„ ์ œํ•œ(Rate limiting)
      • Sticky Assignment ๋ฐ Worker Affinity
    • ์ž‘์—… ๋ถ„๋ฐฐ, ์žฌ์‹œ๋„, ์‹คํŒจ ์•Œ๋ฆผ ์ž๋™ ์ฒ˜๋ฆฌ
    • Python / TypeScript / Go ์˜ˆ์ œ ์ œ๊ณต
  • ์ž‘์—… ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜
    • DAG ๊ธฐ๋ฐ˜ ์›Œํฌํ”Œ๋กœ ๊ตฌ์„ฑ
      • ์กฐ๊ฑด ๊ธฐ๋ฐ˜ ์‹คํ–‰ (์˜ˆ: sleep, ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํŠธ๋ฆฌ๊ฑฐ, ๋ถ€๋ชจ ์ž‘์—…์˜ ์ถœ๋ ฅ๊ฐ’ ๊ธฐ๋ฐ˜ ์กฐ๊ฑด ์‹คํ–‰ ๋“ฑ)
      • ๋ณต์žกํ•œ ๋ถ„๊ธฐ ๋กœ์ง ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
    • ์ž‘์—… ๊ฐ„ ์˜์กด์„ฑ ์ •์˜, ๋‹ค์ค‘ ์ž‘์—… ๋ณ‘๋ ฌ ์‹คํ–‰
    • Durable task๋กœ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ ์ €์žฅ ๋ฐ ๋ณต๊ตฌ ์ง€์›
      • ๋‚ด๊ตฌ์„ฑ ์žˆ๋Š” ํ•จ์ˆ˜ ์‹คํ–‰: ์‹คํŒจ ์‹œ ์ค‘๊ฐ„ ์ƒํƒœ๋ฅผ ์บ์‹œํ•˜๊ณ  ์žฌ์‹คํ–‰์œผ๋กœ ๋ณต์›
      • Durable Sleep๊ณผ Durable Events๋„ ์ง€์›
  • ํ๋ฆ„ ์ œ์–ด (Flow Control)
    • ์‚ฌ์šฉ์ž ๋‹จ์œ„ ๋™์‹œ์„ฑ ์ œํ•œ
    • ๊ธ€๋กœ๋ฒŒ ๋ฐ ๋™์  ์†๋„ ์ œํ•œ (Rate Limiting)
    • ์ „๋žต์  ์ž‘์—… ๋ถ„์‚ฐ์„ ํ†ตํ•œ ์‹œ์Šคํ…œ ์•ˆ์ •์„ฑ ํ™•๋ณด
  • ์ž‘์—… ์Šค์ผ€์ค„๋ง
    • Cron ์ž‘์—…, ์˜ˆ์•ฝ ์‹คํ–‰, durable sleep ์ง€์›
    • ์˜ˆ: ๋งค์ผ ์ž์ • ์‹คํ–‰, ํŠน์ • ์‹œ๊ฐ„ ์˜ˆ์•ฝ, ์ง€์ • ์‹œ๊ฐ„ ๋Œ€๊ธฐ ๋“ฑ
  • ์ž‘์—… ๋ผ์šฐํŒ…
    • Sticky Assignment: ๋™์ผ ์›Œ์ปค์— ์ž‘์—… ๊ณ ์ •
    • Worker Affinity: ์ตœ์ ์˜ ์›Œ์ปค ์„ ํƒ ๋กœ์ง ์ ์šฉ
  • ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํŠธ๋ฆฌ๊ฑฐ
    • ์™ธ๋ถ€ ์ด๋ฒคํŠธ ์ˆ˜์‹  ํ›„ ์ž‘์—… ์‹คํ–‰ ๊ฐ€๋Šฅ
    • ์ด๋ฒคํŠธ/์Šฌ๋ฆฝ ์กฐ๊ฑด ๋ณ‘ํ•ฉ ๊ฐ€๋Šฅ
  • ์‹ค์‹œ๊ฐ„ ์›น UI
    • ์‹ค์‹œ๊ฐ„ ๋Œ€์‹œ๋ณด๋“œ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง
    • ์ž‘์—… ๋กœ๊ทธ ๋ณด๊ธฐ, ์•Œ๋ฆผ ์„ค์ • (Slack/์ด๋ฉ”์ผ)

Hatchet๋ฅผ ์–ธ์ œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ?

  • โœ… DAG ๊ธฐ๋ฐ˜ ์›Œํฌํ”Œ๋กœ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•  ๋•Œ
  • โœ… ์ž‘์—… ์‹คํŒจ ์‹œ ์žฌ์‹œ๋„ ๋ฐ ์ƒํƒœ ๋ณด์กด์ด ์ค‘์š”ํ•  ๋•Œ
  • โœ… ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ž‘์—… ๋ถ„์‚ฐ ์ฒ˜๋ฆฌ
  • โŒ ๋น ๋ฅด๊ฒŒ ์…‹์—… ๊ฐ€๋Šฅํ•œ ๊ฐ„๋‹จํ•œ ํ๋งŒ ํ•„์š”ํ•  ๋•Œ (Celery/BullMQ ๋“ฑ ์ถ”์ฒœ)
  • โŒ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์ปค๋„ฅํ„ฐ์™€ ํ†ตํ•ฉ์ด ์ค‘์š”ํ•  ๋•Œ (Airflow/Prefect ๋“ฑ ์ถ”์ฒœ)

๋น„๊ต: Hatchet vs ๋‹ค๋ฅธ ์†”๋ฃจ์…˜๋“ค

  • Hatchet vs Temporal
    • Hatchet์€ ํ + DAG + Durable Execution ๋ชจ๋‘ ์ง€์›
    • Temporal์€ Durable Execution์— ์ตœ์ ํ™”
    • Hatchet์€ ์…€ํ”„ ํ˜ธ์ŠคํŒ…์ด ๊ฐ„ํŽธ (Postgres๋งŒ ํ•„์š”)
  • Hatchet vs BullMQ / Celery
    • Hatchet์€ ์ž‘์—… ์ด๋ ฅ ์ €์žฅ + UI ์‹œ๊ฐํ™” + ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋‚ด์žฅ
    • BullMQ/Celery๋Š” ๊ฒฝ๋Ÿ‰ ํ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ง€๋งŒ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋Šฅ ๋ถ€์กฑ
  • Hatchet vs Airflow / Prefect
    • Hatchet์€ ๊ณ ์† ์‹คํ–‰, ๋‚ฎ์€ ๋ ˆ์ดํ„ด์‹œ, ์ž์ฒด ์›Œ์ปค ๊ด€๋ฆฌ
    • Airflow/Prefect๋Š” ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ์ค‘์‹ฌ์œผ๋กœ, ํ†ตํ•ฉ ์ปค๋„ฅํ„ฐ์— ๊ฐ•์ 

์š”์•ฝ

  • Hatchet์€ Postgres๋งŒ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ํ˜„๋Œ€์ ์ธ ๋ถ„์‚ฐ ์ž‘์—… ์ฒ˜๋ฆฌ ํ”Œ๋žซํผ
  • Durable, Observable, Composableํ•œ ์ž‘์—… ์‹œ์Šคํ…œ์„ ๋‹จ์ผ ๋„๊ตฌ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
  • ํด๋ผ์šฐ๋“œ/์…€ํ”„ ํ˜ธ์ŠคํŒ… ๋ชจ๋‘ ์ง€์›๋˜๋ฉฐ, Python/Go/TypeScript๋กœ ์‰ฝ๊ฒŒ ํ†ตํ•ฉ ๊ฐ€๋Šฅ

See also

Favorite site