๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๐ŸŒฎ ๐Ÿ’ฌ
๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป/airflow

ํฌ๋กค๋ง ๊ด€๋ฆฌ Airflow vs Celery

by ๋ฐ”์ฟ„๋ฆฌ 2025. 2. 4.

๊ฐœ์š”

๊ธฐ์กด ํ”„๋กœ์ ํŠธ์˜ ํฌ๋กค๋ง ์‹œ์Šคํ…œ์„ Airflow๋กœ ๊ด€๋ฆฌํ–ˆ๋‹ค.

Airflow ์šด์˜ ์ค‘์ด๋˜ ์„œ๋ฒ„์— ๋ฌธ์ œ๊ฐ€ ๋งŽ์•˜๋Š” ๋ฐ, ๊ทธ ์ค‘์—์„œ ์ œ์ผ ํฐ ๋ฌธ์ œ๋Š” cpu ์ ์œ ์œจ์ด 100์œผ๋กœ ์น˜์†Ÿ์„ ๋•Œ๊ฐ€ ๋งŽ์•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

Airflow๋กœ ์šด์˜ํ•˜๋Š” ๊ฒƒ์ด ๋งŽ์ด ๋ฌด๊ฒ๊ณ  ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒˆ์— Airflow๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์กฐ์‚ฌ ๋ฐ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

ํ™•์ธ

Airflow๋Š” ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ๋ฐ ์›Œํฌํ”Œ๋กœ์šฐ ๊ด€๋ฆฌ์— ์ตœ์ ํ™”๋œ ๋„๊ตฌ์ด๋‹ค. ํฌ๋กค๋ง ๊ฐ™์€ ๋‹จ์ˆœํ•œ ์ž‘์—…์„ ์‹คํ–‰ํ•  ๋•Œ์—๋Š” Celery๊ฐ€ ๋” ์ ํ•ฉํ•˜๋‹ค.

Airflow์™€ Celery๋ฅผ ๋น„๊ตํ•ด๋ณด๋ฉด

 

๋น„๊ต ํ•ญ๋ชฉ Celery Airflow
์ฃผ์š” ๋ชฉ์  ๋น„๋™๊ธฐ ์ž‘์—… ์‹คํ–‰ (ํƒœ์Šคํฌ ํ) ๋ฐ์ดํ„ฐ ์›Œํฌํ”Œ๋กœ์šฐ ๋ฐ ํŒŒ์ดํ”„๋ผ์ธ ๊ด€๋ฆฌ
์ž‘์—… ์‹คํ–‰ ๋ฐฉ์‹ ๋น ๋ฅธ ์‹คํ–‰, ๋‹จ์ˆœํ•œ ์ž‘์—… ์ฒ˜๋ฆฌ DAG ๊ธฐ๋ฐ˜, ์Šค์ผ€์ค„๋ง ์ค‘์‹ฌ
์Šค์ผ€์ค„๋ง ๊ธฐ๋ณธ ์ œ๊ณต (beat ์ œ๊ณต) ๊ฐ•๋ ฅํ•œ DAG ๊ธฐ๋ฐ˜ ์Šค์ผ€์ค„๋ง ์ค‘์‹ฌ
์ƒํƒœ ๊ด€๋ฆฌ ์ œํ•œ์  (๋‹จ์ˆœ ์„ฑ๊ณต/์‹คํŒจ) Task, Retry, DAG ์˜์กด์„ฑ ๊ด€๋ฆฌ
์„ค์น˜ ๋ฐ ์„ค์ • ์ƒ๋Œ€์ ์œผ๋กœ ๊ฐ„๋‹จ ๋ณต์žกํ•œ ์„ค์น˜ ๋ฐ ์„ค์ • ํ•„์š”
์‹ค์‹œ๊ฐ„ ํŠธ๋ฆฌ๊ฑฐ ๊ฐ€๋Šฅ DAG ์‹คํ–‰ ๊ธฐ๋ฐ˜์ด๋ผ ์‹ค์‹œ๊ฐ„ ๋Œ€์‘์ด ์–ด๋ ค์›€
์ž‘์—… ๋ฒ™๋ ฌ ์‹คํ–‰ ๊ฐ€๋Šฅ (worker ๊ฐœ์ˆ˜ ์กฐ์ ˆ) CeleryExecuter ๋˜๋Š” KubernetesExecuter ์‚ฌ์šฉ ์‹œ ๊ฐ€๋Šฅ

→ ํฌ๋กค๋ง์€ ๋‹จ์ˆœํ•œ ๊ฐœ๋ณ„ ์ž‘์—…์ด ๋งŽ๊ณ , ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋˜๋ฉฐ, ์‹ค์‹œ๊ฐ„ ์š”์ฒญ์ด ๋งŽ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์œผ๋‹ˆ → Celery๊ฐ€ ๋” ์ ํ•ฉํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

  • ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ๋ฐ ์›Œํฌํ”Œ๋กœ์šฐ ๊ด€๋ฆฌ = ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ž‘์—…์„ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ
  • Airflow๋Š” DAG ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ Task์˜ ์‹คํ–‰ ์ˆœ์„œ์™€ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ๊ฐ•๋ ฅํ•˜๋‹ค.
  • ํฌ๋กค๋ง ์„œ๋น„์Šค๋Š” ๊ฐœ๋ณ„์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„ Celery๊ฐ€ ์ ํ•ฉํ•˜๋‹ค.
  • ํ•˜์ง€๋งŒ ํฌ๋กค๋ง ํ›„ ๋ฐ์ดํ„ฐ ๋ถ„์„๊นŒ์ง€ ํฌํ•จ๋œ๋‹ค๋ฉด Airflow๋ฅผ ๊ณ ๋ คํ•ด๋„ ๋œ๋‹ค.

์‹ค์‹œ๊ฐ„ Trigger ๊ฐ€๋Šฅ

  • Celery๋Š” API ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์ฆ‰์‹œ ์‹คํ–‰ ๊ฐ€๋Šฅ (apply_async() ์‚ฌ์šฉ)
  • Airflow๋Š” DAG ์‹คํ–‰ ๋ฐฉ์‹์ด๋ผ ์ฆ‰์‹œ ์‹คํ–‰์ด ์–ด๋ ต๊ณ  trigger๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•จ

์˜ˆ์ œ

(1) Celery

from tasks import crawl_site
crawl_site.apply_async(args=["https://example.com"])

→ ์ฆ‰์‹œ ์‹คํ–‰ ๊ฐ€๋Šฅ

 

(2) Airflow

from airflow.api.client.local_client import Client
client = Client(None)
client.trigger_dag(dag_id="crawl_dag")

→ DAG ์‹คํ–‰์„ ํŠธ๋ฆฌ๊ฑฐํ•ด์•ผ ํ•ด์„œ ์ฆ‰์‹œ ์‹คํ–‰์ด ์–ด๋ ค์›€

ํฌ๋กค๋ง Task๋Š” ๋‹จ์ˆœํ•œ ๊ฐœ๋ณ„ ์‹คํ–‰์ด๋ฏ€๋กœ DAG ํ•„์š” ์—†์Œ

  • Airflow๋Š” DAG(Direct Acyclic Graph) ๊ธฐ๋ฐ˜์ด๋ผ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์˜ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ์ตœ์ ํ™”๋˜์–ด ์žˆ๋‹ค.
  • ํฌ๋กค๋ง์€ ๋ณดํ†ต ๋‹จ์ˆœํ•œ ์š”์ฒญ์„ ์‹คํ–‰ํ•˜๋Š” ์ž‘์—…์ด๋ฏ€๋กœ DAG๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • Celery๋Š” ๋‹จ์ˆœํ•œ ๋น„๋™๊ธฐ ํ…Œ์ŠคํŠธ ์‹คํ–‰์ด๋ผ ํฌ๋กค๋ง์— ์ ํ•ฉํ•˜๋‹ค.

Celery๋„ ์Šค์ผ€์ค„๋ง ๊ฐ€๋Šฅ

  • Celery๋Š” celery-beat๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํฌ๋ก ์ฒ˜๋Ÿผ ์Šค์ผ€์ค„๋ง ๊ฐ€๋Šฅ
  • ํฌ๋กค๋ง ์Šค์ผ€์ค„๋ง์ด ํ•„์š”ํ•˜๋ฉด Celery๋กœ๋„ ์ถฉ๋ถ„ํžˆ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
from celery.schedules import crontab

app.conf.beat_schedule = {
    'crawl_every_minute': {
        'task': 'tasks.crawl_site',
        'schedule': crontab(minute='*/1'),  # 1๋ถ„๋งˆ๋‹ค ์‹คํ–‰
        'args': ('https://example.com',)
    },
}

๊ฒฐ๋ก 

Airflow๋ณด๋‹ค Celery๋ฅผ ์“ฐ๋Š” ๊ฒŒ ๋” ๊ฐ„๋‹จํ•˜๊ณ  ํšจ์œจ์ ์ด๋ผ๊ณ  ํŒ๋‹จ.

Airflow๋Š” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์›Œํฌํ”Œ๋กœ์šฐ ์ „์šฉ์ด๋ผ ํฌ๋กค๋ง ๊ฐ™์€ ์งง์€ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ์—” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฌ๋‹ค.

๋”ฐ๋ผ์„œ, Celery + FastAPI ์กฐํ•ฉ์œผ๋กœ ํฌ๋กค๋ง ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค๊ณ , ํ•„์š”ํ•˜๋ฉด celery-beat๋กœ ์Šค์ผ€์ค„๋ง์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฑธ ๊ณ ๋ คํ•˜๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ํŒ๋‹จ๋œ๋‹ค.

 

+ Celery๋ฅผ ์ด์šฉํ•œ ํฌ๋กค๋ง ์˜ˆ์ œ๋ฅผ ์ถ”๊ฐ€๋กœ ์ •๋ฆฌํ–ˆ๋‹ค.

 

Celery๋ฅผ ์ด์šฉํ•œ ํฌ๋กค๋ง ์˜ˆ์ œ

๊ฐœ์š”FastAPI + Celery + requests + BeautifulSoup ๋ฅผ ํ™œ์šฉํ•œ ํฌ๋กค๋ง ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์„ ์˜ˆ์ œํฌ๋กค๋ง์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๋„๋ก ์ง„ํ–‰๊ธฐ๋ณธ ๊ตฌ์กฐFastAPI: ์‚ฌ์šฉ์ž๊ฐ€ API๋ฅผ ํ†ตํ•ด ํฌ๋กค๋ง ์š”์ฒญ์„ ๋ณด

bonory.tistory.com