Celery Taskları RAM’de Schedule Etmek

Merhabalar, yaptığım küçük bi iş sonucunda müşterim benden küçük bir Redis sunucusunu hemen ayağa kaldırmak yerine Celery tasklarını memory’de çalıştırıp çalıştıramayacağımızı sordu. Denedim ve sonucun production ortamı için uygun olmadığını gördüm.

Bu arada kısaca Celery’den bahsedeyim. Python camiasında oldukça popüler bir görev kuyruğu framework’üdür. İş akışlarınızı Django’dan bağımsız olarak arkaplanda çalıştırmanızı sağlar.

Benden istendiği gibi memory’de çalıştırmak çok gereksiz birşeymiş gibi gelebilir, fakat vereceğim bilgiyi oluşturduğunuz celery tasklarının testlerini yazarken de kullanabilirsiniz.

Bu durumun production için neden uygun olmadığını anlatacağım. Uygulamasına geçelim.

settings.py dosyasına şu üç ayarı girmeniz tasklarınızı RAM üzerinden test etmenize olanak sağlayacaktır.

CELERY_EAGER_PROPAGATES_EXCEPTIONS=True
CELERY_ALWAYS_EAGER=True
BROKER_BACKEND="memory"

In-memory Broker: Farkettiğiniz üzere BROKER_BACKEND değerini memory şeklinde ayarladık, burada mesaj aktarımın Redis veya amqp değil de sanal bi method üzerinden halledilmesini sağlıyoruz. Ayrıca, schedule edilen tasklar, direkt olarak aynı process içerisinde anında çalıştırılmaya başlanacaktır. Yani burada worker ayağa kaldırmıyoruz sadece beat’i ayağa kaldırıyoruz. Kuyruğa koyma olayı yok, beat ilgili task’ın vakti geldiği gibi taskı aynı process içerisinde çalıştırıp geçiyor.

CELERY_ALWAYS_EAGER ayarını kullandık, taskların arkaplanda değil de schedule edildiği yerde senkron olarak çalıştırılmasını sağladık. Bu ayar production’da kullanılmaz, ciddi performans sorunu oluşturur.

CELERY_EAGER_PROPAGATES_EXCEPTIONS ayarını kullandık. Normalde tasklar çalıştıktan sonra hata oluşsa da oluşmasa da her zaman null değeri döner ve bir exception fırlatılırsa yakalamayız. Bu ayarı kullanarak fırlatılan hata, task içerisindeki ilgili kod bloğuna döndürülür ve hatanın yeri daha kolay bulunur.

Görüldüğü üzere, bu ayarlar oluşturulan task bloğunu hızlı bir şekilde test edebilmeye yaramaktadır. Ayrıca Django’da task testlerinizi de bu ayarları override ederek yazabilirsiniz. Örneğin burda.

Sonraki yazıda görüşmek üzere.