
celery-rabbitmq
by eco2-team
๐ฑ ์ด์ฝ์์ฝ(Ecoยฒ) BE
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 Case | TTL | ์ค๋ช |
|---|---|---|
| ๋๊ธฐ ์๋ต (RPC) | 30์ด | ๋น ๋ฅธ ์๋ต ํ์ |
| ๋น ๋ฅธ ์ฒ๋ฆฌ | 5๋ถ | Rule-based, ๋จ์ ๋ก์ง |
| ์ผ๋ฐ ์ฒ๋ฆฌ | 10๋ถ~1์๊ฐ | API ํธ์ถ, DB ์์ |
| AI/LLM ์ฒ๋ฆฌ | 1์๊ฐ | GPT, Vision ๋ฑ |
| ์ค์ ๋ฐ์ดํฐ | 24์๊ฐ | DB ์ ์ฅ, ๊ฒฐ์ ๋ฑ |
| DLQ | 7์ผ | ์คํจ ๋ฉ์์ง ๋ณด๊ด |
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 |
| VHost | eco2 |
| ๊ณ์ | 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 ์ถ๊ฐ
-
Celery ์ค์ (
apps/<worker>/setup/celery.py)-
WORKER_TASK_ROUTES์ ํ์คํฌ ์ถ๊ฐ -
WORKER_TASK_QUEUES์ Queue ์ถ๊ฐ (no_declare=True) -
task_create_missing_queues=Falseํ์ธ
-
-
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 ์ถ๊ฐ
-
-
Kustomization
-
kustomization.yaml์ ์ ํ์ผ ํฌํจ ํ์ธ
-
-
๋ฐฐํฌ
- 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
- Topology CR: queues.yaml
- Celery ์์: scan_worker/setup/celery.py
Score
Total Score
Based on repository quality metrics
SKILL.mdใใกใคใซใๅซใพใใฆใใ
ใฉใคใปใณในใ่จญๅฎใใใฆใใ
100ๆๅญไปฅไธใฎ่ชฌๆใใใ
GitHub Stars 100ไปฅไธ
3ใถๆไปฅๅ ใซๆดๆฐใใใ
10ๅไปฅไธใใฉใผใฏใใใฆใใ
ใชใผใใณIssueใ50ๆชๆบ
ใใญใฐใฉใใณใฐ่จ่ชใ่จญๅฎใใใฆใใ
1ใคไปฅไธใฎใฟใฐใ่จญๅฎใใใฆใใ
Reviews
Reviews coming soon