Five Sticks of CELERY
Some work-a-day tips...
1. Requirements
PIP
celery[librabbitmq]==3.1.11 django-celery==3.1.10
OS
sudo apt-get install rabbitmq-server # go for >= 2.7.3 sudo rabbitmqctl add_user eedeep <secret password>
sudo rabbitmqctl add_vhost eedeep_host sudo rabbitmqctl set_permissions -p eedeep_host eedeep ".*" ".*" ".*" # For the rabbitmq management console sudo rabbitmqctl set_user_tags cottonon administrator sudo rabbitmq-plugins enable rabbitmq_management
2. Monitoring
flower
(but no persistent backend)
djcelery tombstones
(needs celerycam)
3. Retry
@app.task(bind=True, default_retry_delay=60 * 60, max_retries=24)
def push_subscriber(self, subscriber): try: push_to_some_unreliable_service(subscriber) except NoConnectionException: log.info("Could not connect to unreliable service, retrying later") raise self.retry()
* This didn't work with celery 2.5.3, needs celery >= 3
4. Partition your tasks
from kombu import Exchange, Queue
CELERY_QUEUES = (
Queue("default", Exchange("default"), routing_key="default"),
Queue("important", Exchange("important"), routing_key="important"),
Queue("medium", Exchange("medium"), routing_key="medium"),
) CELERY_DEFAULT_QUEUE = "default"
CELERY_DEFAULT_EXCHANGE = "default"
CELERY_DEFAULT_EXCHANGE_TYPE = "direct"
CELERY_DEFAULT_ROUTING_KEY = "default"
CELERY_ROUTES = (
{"shop.orders.create_order_in_backoffice": {
"queue": "important",
"routing_key": "important"}
},
{"spam.promotions.send_email_promotion": {
"queue": "medium",
"routing_key": "medium"}
}, # All other tasks will go to the default queue
)
5. DEBUGGING
CELERY_ALWAYS_EAGER = True
This makes all your celery tasks run
*synchronously*, which makes interactive
debugging easier (ie, possible).
IF You get stuck....
...BETTER asksol (in #celery on freenode)
Thanks for listening!
@eedeep
Five Sticks of CELERy
By eedeep
Five Sticks of CELERy
- 1,281