Celery: ๋™์ผํ•œ ๋Œ€๊ธฐ์—ด์— ๋Œ€ํ•œ ๋‹ค์ค‘ ๋ฐ”์ธ๋”ฉ: RabbitMQ์—์„œ ๋งˆ์ง€๋ง‰ ๋ฐ”์ธ๋”ฉ๋งŒ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 10์›” 31์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: celery/celery

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • [X] ๋ฌธ์ œ์— celery -A proj report ์˜ ์ถœ๋ ฅ์„ ํฌํ•จํ–ˆ์Šต๋‹ˆ๋‹ค.
    (์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์ตœ์†Œํ•œ Celery๋ฅผ ์ง€์ •ํ•˜์‹ญ์‹œ์˜ค.
    ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋ฒ„์ „).
  • [x] Celery์˜ master ๋ถ„๊ธฐ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
software -> celery:3.1.0 (Cipater) kombu:3.0.37 py:2.7.10
            billiard:3.3.0.23 py-amqp:1.4.9
platform -> system:Darwin arch:64bit imp:CPython
loader   -> celery.loaders.default.Loader
settings -> transport:amqp results:redis://localhost:6379/0

CELERY_QUEUES:
    (<unbound Queue Test_Queue -> <unbound Exchange test_exchange(topic)> -> myapp.tasks.some_tasks.#>,
 <unbound Queue Test_Queue -> <unbound Exchange test_exchange(topic)> -> myapp.tasks.more_tasks.#>)
RABBITMQ_MANAGEMENT_URL: 'localhost:15672'
CELERY_IMPORTS:
    ('myapp.tasks.some_tasks', 'myapp.tasks.more_tasks')
CELERY_ROUTES:
    (<myapp.routers.DefaultRouter object at 0x1077952d0>,)
BROKER_URL: 'amqp://guest:********<strong i="13">@localhost</strong>:5672//'
CELERY_RESULT_BACKEND: 'redis://localhost:6379/0'

์žฌํ˜„ ๋‹จ๊ณ„

  1. ๋‹ค๋ฅธ ๋ผ์šฐํŒ… ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ† ํ”ฝ ๊ตํ™˜์— 2๊ฐœ์˜ ๋ฐ”์ธ๋”ฉ์„ ์ƒ์„ฑํ•˜์ง€๋งŒ CELERY_QUEUES์˜ ๋™์ผํ•œ ๋Œ€๊ธฐ์—ด์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
CELERY_QUEUES = (
    Queue("Test_Queue", default_exchange, routing_key="myapp.tasks.some_tasks.#"),
    Queue("Test_Queue", default_exchange, routing_key="myapp.tasks.more_tasks.#"),
)
  1. ์…€๋Ÿฌ๋ฆฌ ์ž‘์—…์ž ์ธ์Šคํ„ด์Šคํ™”
  2. RabbitMQ ๊ด€๋ฆฌ ์ฝ˜์†” http://localhost :15672/๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋Œ€๊ธฐ์—ด ํƒญ์„ ํด๋ฆญํ•œ ๋‹ค์Œ ์„ค์ •์—์„œ ์ƒ์„ฑํ•œ ๋Œ€๊ธฐ์—ด์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  4. 1๊ฐœ์˜ ๋ฐ”์ธ๋”ฉ๋งŒ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ
    screen shot 2016-10-31 at 5 52 03 pm

์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™

  1. ๋ผ์šฐํŒ… ํ‚ค myapp.tasks.some_tasks.# ํ•˜๋Š” ๋‘ ๋ฒˆ์งธ ๋ฐ”์ธ๋”ฉ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ด๊ฒƒ์€ ์…€๋Ÿฌ๋ฆฌ amqp ์ฝ˜์†”์—์„œ ๋ณต์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
celery amqp
queue.bind Test_Queue test_exchange Key1
queue.bind Test_Queue test_exchange Key2

์‹ค์ œ ํ–‰๋™

  1. ์ฃผ์–ด์ง„ ํ ์ด๋ฆ„์˜ ๋งˆ์ง€๋ง‰ ๋ฐ”์ธ๋”ฉ๋งŒ rabbitmq์—์„œ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

CELERY_QUEUES๋Š” queue_name์—์„œ queue๋กœ์˜ ๋งคํ•‘์ด๋ฏ€๋กœ ๋‘ ๊ฐœ์˜ ๋Œ€๊ธฐ์—ด์„ ์ •์˜ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ
์ด๋ฆ„์ด ๊ฐ™์œผ๋ฉด ๊ทธ ์ค‘ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Kombu์—์„œ ์—ฌ๋Ÿฌ ๋ฐ”์ธ๋”ฉ์ด ์žˆ๋Š” ๋Œ€๊ธฐ์—ด์„ ์ •์˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

from kombu import Exchange, Queue, binding
default_exchange = Exchange('default', type='direct')

CELERY_QUEUES = (
    Queue('Test_Queue', [
         binding(default_exchange, routing_key='myapp.tasks.some_tasks.#'),
         binding(default_exchange, routing_key='myapp.tasks.more_tasks.#'),
    ]),
)

๋ชจ๋“  3 ๋Œ“๊ธ€

CELERY_QUEUES๋Š” queue_name์—์„œ queue๋กœ์˜ ๋งคํ•‘์ด๋ฏ€๋กœ ๋‘ ๊ฐœ์˜ ๋Œ€๊ธฐ์—ด์„ ์ •์˜ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ
์ด๋ฆ„์ด ๊ฐ™์œผ๋ฉด ๊ทธ ์ค‘ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Kombu์—์„œ ์—ฌ๋Ÿฌ ๋ฐ”์ธ๋”ฉ์ด ์žˆ๋Š” ๋Œ€๊ธฐ์—ด์„ ์ •์˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

from kombu import Exchange, Queue, binding
default_exchange = Exchange('default', type='direct')

CELERY_QUEUES = (
    Queue('Test_Queue', [
         binding(default_exchange, routing_key='myapp.tasks.some_tasks.#'),
         binding(default_exchange, routing_key='myapp.tasks.more_tasks.#'),
    ]),
)

์—„์ฒญ๋‚œ! ๋ฐฉ๊ธˆ ํ…Œ์ŠคํŠธํ–ˆ๊ณ  ๋‘ ๋ฐ”์ธ๋”ฉ์ด ๋ชจ๋‘ ์ธ์Šคํ„ด์Šคํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ผ์šฐํŒ… ๋ฌธ์„œ์— ์ถ”๊ฐ€ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ค๋Š˜ ๋ฐค์ด๋‚˜ ๋‚ด์ผ์ฏค ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

ํ™•์‹ ํ•˜๋Š”! ๋ฌธ์„œ์— ํฌํ•จ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. :)

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰