โ† Back to list
eco2-team

celery-rabbitmq

by eco2-team

๐ŸŒฑ ์ด์ฝ”์—์ฝ”(Ecoยฒ) BE

โญ 0๐Ÿด 0๐Ÿ“… Jan 25, 2026

SKILL.md


name: celery-rabbitmq description: Celery Worker + RabbitMQ Topology CR ํŒจํ„ด ๊ฐ€์ด๋“œ. ํ ์ƒ์„ฑ, Exchange/Binding ์ •์˜, DLQ ์„ค์ • ์‹œ ์ฐธ์กฐ. "celery", "rabbitmq", "queue", "topology", "dlq", "exchange", "binding" ํ‚ค์›Œ๋“œ๋กœ ํŠธ๋ฆฌ๊ฑฐ.

Celery + RabbitMQ Topology Pattern Guide

Overview

Eco2 ํ”„๋กœ์ ํŠธ์—์„œ Celery Worker + RabbitMQ ๊ตฌ์„ฑ ์‹œ Topology CR(Custom Resource)์— ํ ์ƒ์„ฑ์„ ์œ„์ž„ํ•˜๋Š” ํŒจํ„ด.

ํ•ต์‹ฌ ์›์น™: Python ์ฝ”๋“œ์—์„œ๋Š” ๋ผ์šฐํŒ…๋งŒ ์ •์˜, ํ/Exchange/Binding ์ƒ์„ฑ์€ Kubernetes Topology CR์—์„œ ์„ ์–ธ์ ์œผ๋กœ ๊ด€๋ฆฌ.


Architecture

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    Queue Creation Flow                          โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                  โ”‚
โ”‚  Topology CR (YAML)          RabbitMQ Operator                  โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                โ”‚
โ”‚  โ”‚ Queue CR        โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚ Create Queue     โ”‚                โ”‚
โ”‚  โ”‚ Exchange CR     โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚ Create Exchange  โ”‚                โ”‚
โ”‚  โ”‚ Binding CR      โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚ Create Binding   โ”‚                โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                โ”‚
โ”‚                                      โ”‚                          โ”‚
โ”‚                                      โ–ผ                          โ”‚
โ”‚  Celery Worker              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”        โ”‚ RabbitMQ Cluster โ”‚                โ”‚
โ”‚  โ”‚ task_routes     โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚ (eco2-rabbitmq)  โ”‚                โ”‚
โ”‚  โ”‚ task_queues     โ”‚        โ”‚                  โ”‚                โ”‚
โ”‚  โ”‚ no_declare=True โ”‚        โ”‚ vhost: eco2      โ”‚                โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                โ”‚
โ”‚                                                                  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Celery Configuration Pattern

1. Task Routes (ํƒœ์Šคํฌ โ†’ ํ ๋งคํ•‘)

# apps/<worker>/setup/celery.py

WORKER_TASK_ROUTES = {
    "domain.task_name": {"queue": "domain.task_name"},
    "domain.another_task": {"queue": "domain.another_task"},
}

2. Task Queues (kombu Queue ์ •์˜)

from kombu import Queue

# โš ๏ธ ํ•ต์‹ฌ: no_declare=True, exchange=""
WORKER_TASK_QUEUES = [
    Queue("domain.task_name", exchange="", routing_key="domain.task_name", no_declare=True),
    Queue("domain.another_task", exchange="", routing_key="domain.another_task", no_declare=True),
]

ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค๋ช…:

  • exchange="": AMQP Default Exchange ์‚ฌ์šฉ (queue ์ด๋ฆ„์œผ๋กœ ์ง์ ‘ ๋ผ์šฐํŒ…)
  • routing_key=<queue_name>: Default Exchange์—์„œ๋Š” queue ์ด๋ฆ„๊ณผ ๋™์ผํ•ด์•ผ ํ•จ
  • no_declare=True: Celery/kombu๊ฐ€ ํ๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š์Œ (Topology CR์ด ์ƒ์„ฑ)

3. Celery App ์„ค์ •

celery_app.conf.update(
    # Task routing
    task_routes=WORKER_TASK_ROUTES,
    task_queues=WORKER_TASK_QUEUES,

    # โš ๏ธ ํ•ต์‹ฌ: ํ ์ž๋™ ์ƒ์„ฑ ๋น„ํ™œ์„ฑํ™”
    task_create_missing_queues=False,

    # Default Exchange ์‚ฌ์šฉ
    task_default_exchange="",
    task_default_routing_key="celery",

    # ์ผ๋ฐ˜ ์„ค์ •
    task_serializer="json",
    accept_content=["json"],
    task_acks_late=True,
    task_reject_on_worker_lost=True,
    worker_prefetch_multiplier=1,
)

RabbitMQ Topology CR Pattern

Queue CR

apiVersion: rabbitmq.com/v1beta1
kind: Queue
metadata:
  name: <worker>-<task>-queue  # K8s ๋ฆฌ์†Œ์Šค๋ช… (kebab-case)
  namespace: rabbitmq
spec:
  name: <domain>.<task>        # ์‹ค์ œ ํ ์ด๋ฆ„ (dot notation)
  type: classic                # Classic Queue (Celery ํ˜ธํ™˜)
  durable: true
  autoDelete: false
  vhost: eco2
  arguments:
    x-dead-letter-exchange: dlx
    x-dead-letter-routing-key: dlq.<domain>.<task>
    x-message-ttl: 3600000     # 1์‹œ๊ฐ„ (์šฉ๋„์— ๋”ฐ๋ผ ์กฐ์ •)
  rabbitmqClusterReference:
    name: eco2-rabbitmq
    namespace: rabbitmq

Dead Letter Queue CR

apiVersion: rabbitmq.com/v1beta1
kind: Queue
metadata:
  name: dlq-<domain>-<task>
  namespace: rabbitmq
spec:
  name: dlq.<domain>.<task>
  type: classic
  durable: true
  autoDelete: false
  vhost: eco2
  arguments:
    x-message-ttl: 604800000   # 7์ผ ๋ณด๊ด€
  rabbitmqClusterReference:
    name: eco2-rabbitmq
    namespace: rabbitmq

DLX Binding CR

apiVersion: rabbitmq.com/v1beta1
kind: Binding
metadata:
  name: dlx-<domain>-<task>-binding
  namespace: rabbitmq
spec:
  source: dlx                  # Dead Letter Exchange
  destination: dlq.<domain>.<task>
  destinationType: queue
  routingKey: dlq.<domain>.<task>
  vhost: eco2
  rabbitmqClusterReference:
    name: eco2-rabbitmq
    namespace: rabbitmq

Exchange Types

1. Default Exchange ("")

  • Celery ๊ธฐ๋ณธ ํŒจํ„ด
  • routing_key = queue name์œผ๋กœ ์ง์ ‘ ๋ผ์šฐํŒ…
  • Exchange CR ๋ถˆํ•„์š”

2. Direct Exchange

  • Named Exchange + routing_key ๋งค์นญ
  • ํŠน์ • ํ๋กœ ๋ช…์‹œ์  ๋ผ์šฐํŒ…
apiVersion: rabbitmq.com/v1beta1
kind: Exchange
metadata:
  name: <domain>-direct
  namespace: rabbitmq
spec:
  name: <domain>.direct
  type: direct
  durable: true
  autoDelete: false
  vhost: eco2
  rabbitmqClusterReference:
    name: eco2-rabbitmq
    namespace: rabbitmq

3. Fanout Exchange

  • ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ํŒจํ„ด (1:N)
  • routing_key ๋ฌด์‹œ, ๋ฐ”์ธ๋”ฉ๋œ ๋ชจ๋“  ํ์— ๋ณต์ œ
apiVersion: rabbitmq.com/v1beta1
kind: Exchange
metadata:
  name: <domain>-events
  namespace: rabbitmq
spec:
  name: <domain>.events
  type: fanout
  durable: true
  autoDelete: false
  vhost: eco2
  rabbitmqClusterReference:
    name: eco2-rabbitmq
    namespace: rabbitmq

TTL Guidelines

Use CaseTTL์„ค๋ช…
๋™๊ธฐ ์‘๋‹ต (RPC)30์ดˆ๋น ๋ฅธ ์‘๋‹ต ํ•„์š”
๋น ๋ฅธ ์ฒ˜๋ฆฌ5๋ถ„Rule-based, ๋‹จ์ˆœ ๋กœ์ง
์ผ๋ฐ˜ ์ฒ˜๋ฆฌ10๋ถ„~1์‹œ๊ฐ„API ํ˜ธ์ถœ, DB ์ž‘์—…
AI/LLM ์ฒ˜๋ฆฌ1์‹œ๊ฐ„GPT, Vision ๋“ฑ
์ค‘์š” ๋ฐ์ดํ„ฐ24์‹œ๊ฐ„DB ์ €์žฅ, ๊ฒฐ์ œ ๋“ฑ
DLQ7์ผ์‹คํŒจ ๋ฉ”์‹œ์ง€ ๋ณด๊ด€

File Locations

workloads/rabbitmq/base/topology/
โ”œโ”€โ”€ exchanges.yaml    # Exchange ์ •์˜
โ”œโ”€โ”€ queues.yaml       # Queue + DLQ ์ •์˜
โ”œโ”€โ”€ bindings.yaml     # Exchange โ†’ Queue ๋ฐ”์ธ๋”ฉ
โ”œโ”€โ”€ vhost.yaml        # VHost ์ •์˜ (eco2)
โ”œโ”€โ”€ users.yaml        # User CR + credentials Secret
โ”œโ”€โ”€ permissions.yaml  # Permission CR
โ””โ”€โ”€ kustomization.yaml

RabbitMQ ์—ฐ๊ฒฐ ์ •๋ณด

Ecoยฒ ํด๋Ÿฌ์Šคํ„ฐ ์„ค์ •

ํ•ญ๋ชฉ๊ฐ’
ํด๋Ÿฌ์Šคํ„ฐeco2-rabbitmq.rabbitmq.svc.cluster.local:5672
VHosteco2
๊ณ„์ •eco2worker
URL ํ˜•์‹amqp://eco2worker:<password>@eco2-rabbitmq.rabbitmq.svc.cluster.local:5672/eco2

User CR ๊ด€๋ฆฌ

# workloads/rabbitmq/base/topology/users.yaml
apiVersion: rabbitmq.com/v1beta1
kind: User
metadata:
  name: eco2-worker-user
  namespace: rabbitmq
spec:
  tags:
  - management
  rabbitmqClusterReference:
    name: eco2-rabbitmq
    namespace: rabbitmq
  importCredentialsSecret:
    name: eco2-worker-credentials

Permission CR

# workloads/rabbitmq/base/topology/permissions.yaml
apiVersion: rabbitmq.com/v1beta1
kind: Permission
metadata:
  name: eco2-worker-permission
  namespace: rabbitmq
spec:
  vhost: eco2
  userReference:
    name: eco2-worker-user
  permissions:
    configure: ".*"
    write: ".*"
    read: ".*"
  rabbitmqClusterReference:
    name: eco2-rabbitmq
    namespace: rabbitmq

Checklist: New Worker Queue ์ถ”๊ฐ€

  1. Celery ์„ค์ • (apps/<worker>/setup/celery.py)

    • WORKER_TASK_ROUTES์— ํƒœ์Šคํฌ ์ถ”๊ฐ€
    • WORKER_TASK_QUEUES์— Queue ์ถ”๊ฐ€ (no_declare=True)
    • task_create_missing_queues=False ํ™•์ธ
  2. Topology CR (workloads/rabbitmq/base/topology/)

    • queues.yaml: Queue CR ์ถ”๊ฐ€
    • queues.yaml: DLQ CR ์ถ”๊ฐ€
    • bindings.yaml: DLX Binding CR ์ถ”๊ฐ€
    • (์„ ํƒ) exchanges.yaml: Named Exchange ์ถ”๊ฐ€
    • (์„ ํƒ) bindings.yaml: Exchange โ†’ Queue Binding ์ถ”๊ฐ€
  3. Kustomization

    • kustomization.yaml์— ์ƒˆ ํŒŒ์ผ ํฌํ•จ ํ™•์ธ
  4. ๋ฐฐํฌ

    • ArgoCD Sync๋กœ Topology CR ์ ์šฉ
    • RabbitMQ Management UI์—์„œ ํ ์ƒ์„ฑ ํ™•์ธ
    • Worker ๋ฐฐํฌ ํ›„ ํ ์†Œ๋น„ ํ™•์ธ

Troubleshooting

Worker ์‹œ์ž‘ ์‹œ "Queue not found"

  • Topology CR์ด ๋จผ์ € ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
  • kubectl get queues -n rabbitmq ๋กœ Queue CR ์ƒํƒœ ํ™•์ธ

๋ฉ”์‹œ์ง€๊ฐ€ DLQ๋กœ ์ด๋™ํ•˜์ง€ ์•Š์Œ

  • Queue arguments์— x-dead-letter-exchange: dlx ํ™•์ธ
  • DLX Binding์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธ

Celery๊ฐ€ ํ๋ฅผ ์žฌ์„ ์–ธํ•จ

  • no_declare=True ๋ˆ„๋ฝ ํ™•์ธ
  • task_create_missing_queues=False ํ™•์ธ

Reference Files

Score

Total Score

60/100

Based on repository quality metrics

โœ“SKILL.md

SKILL.mdใƒ•ใ‚กใ‚คใƒซใŒๅซใพใ‚Œใฆใ„ใ‚‹

+20
โœ“LICENSE

ใƒฉใ‚คใ‚ปใƒณใ‚นใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใ‚‹

+10
โ—‹่ชฌๆ˜Žๆ–‡

100ๆ–‡ๅญ—ไปฅไธŠใฎ่ชฌๆ˜ŽใŒใ‚ใ‚‹

0/10
โ—‹ไบบๆฐ—

GitHub Stars 100ไปฅไธŠ

0/15
โ—‹ๆœ€่ฟ‘ใฎๆดปๅ‹•

3ใƒถๆœˆไปฅๅ†…ใซๆ›ดๆ–ฐใŒใ‚ใ‚‹

0/10
โ—‹ใƒ•ใ‚ฉใƒผใ‚ฏ

10ๅ›žไปฅไธŠใƒ•ใ‚ฉใƒผใ‚ฏใ•ใ‚Œใฆใ„ใ‚‹

0/5
โœ“Issue็ฎก็†

ใ‚ชใƒผใƒ—ใƒณIssueใŒ50ๆœชๆบ€

+5
โœ“่จ€่ชž

ใƒ—ใƒญใ‚ฐใƒฉใƒŸใƒณใ‚ฐ่จ€่ชžใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใ‚‹

+5
โ—‹ใ‚ฟใ‚ฐ

1ใคไปฅไธŠใฎใ‚ฟใ‚ฐใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใ‚‹

0/5

Reviews

๐Ÿ’ฌ

Reviews coming soon