Sitemap

Celery Nedir?

A Distributed Task Queue

Celery, UNIX sistemleri için dağıtılmış bir görev kuyruğudur, kelime anlamıyla ‘kereviz’ demektir. Ama Celery, yalnızca bir sebze değil, aynı zamanda yazılım dünyasında süreçleri yönetmek için kullanılan güçlü bir araçtır. Kerevizin vücudumuzdaki dengeleyici etkisi, Celery’nin sistem süreçlerini nasıl düzenlediğini anlamak için bir metafor olabilir. Tıpkı kerevizin vücudumuzda dengeleyici ve temizleyici özelliklere sahip olması gibi, Celery de yazılım projelerinde iş yüklerini dengeler ve süreci düzenler. Uzun süren işlemleri arka planda çalıştırarak sistemi “sağlıklı” tutar ve kullanıcı deneyimini iyileştirir.

Distributed task queue, dağıtılmış mesaj geçişine dayanan, iş kuyruğu sistemi ve asenkron görev kuyruğu işleyicisidir. Temelde uzun süren işlemleri (örneğin, e-posta gönderimi, veri işleme, dosya dönüştürme gibi) arka planda gerçekleştirmek için tasarlanmıştır. Celery, iş yüklerini yönetmek için bir mesaj kuyruğu aracısı (broker) kullanır ve işleri belirli işçileri (worker) kullanarak işler.

Çoğu geliştiricinin Celery kullanılmasının temel nedenleri şu şekildedir:

Offloading Work: Uygulamadaki işleri, uygulamadan bağımsız olarak çalışabilen dağıtılmış süreçlere devreder.

Ölçeklenebilirlik: Çok sayıda worker ve broker ekleyerek sistem genişletilebilir.

Yapılandırılabilirlik: Görev önceliklendirme, tekrar deneme stratejileri gibi çeşitli özellikler sunar.

Zamanlanmış Görevler: Uygulama üzerinde gerçek zamanlı, anlık tetiklenen, zamanlanmış görevleri etkin bir şekilde yönetebilir. Belirli bir zamanda veya düzenli aralıklarla çalışacak görevler tanımlanabilir; belirli bir zaman aralığında veri toplama veya rapor oluşturma işlemleri gibi. Bunun için celery-beat gibi eklentiler kullanılır.

  • Kullanıcılara Mail Gönderme: Kullanıcıların kayıt, şifre sıfırlama gibi işlemleri sırasında e-posta gönderim süreçlerini otomatikleştirme.
  • Görsel İşleme: Uygulamaya yüklenen görsellerin işlenmesi, optimize edilmesi veya analiz edilmesi gibi işlemleri gerçekleştirme.
  • Push Notification Gönderimi: Kullanıcılara uygulama üzerinden anlık bildirimler göndererek etkileşim artırma.
  • Kritik Verilerin Backup Alınması: Trafiğin az olduğu saatlerde kritik verilerin düzenli olarak yedeklenmesi ve veri güvenliğinin sağlanması.
  • Uygulamalar Arası Periyodik İletişim: Birbiriyle ilişkili, ancak bağımsız çalışan iki farklı uygulama arasında düzenli veri alışverişi ve işlem senkronizasyonunun sağlanması. Bu, arka planda asenkron şekilde çalışan görevlerle yapılabilir, böylece her iki uygulama da yüksek performansla çalışabilir.
Press enter or click to view image in full size
Görsel Yiğit Güler’in Celery ile Görev Tabanlı Mimariye Giriş videosundan alınmıştır.

Zaman maliyeti olan işleri Celery ile dış kaynaklı çözümlemek, özellikle aşağıdaki durumlarda avantaj sağlar:

  1. Ana Uygulama Performansı: Uzun süren işlemleri asenkron olarak yönetmek, ana uygulamanın yanıt verme süresini hızlandırır ve kullanıcı deneyimini iyileştirir.
  2. İş Yükü Dağıtımı: İşlemleri farklı sunuculara dağıtarak yük dengelemesi sağlanabilir. Celery worker’ları ölçeklenebilir olduğu için bu iş dağıtımı kolayca yapılır.
  3. Dış Kaynaklı İşleme: Belirli bir işin dış kaynaklarda (örneğin, harici bir API veya farklı bir altyapı) yapılması gerektiğinde, Celery bu işlemleri düzenlemek için idealdir.

Celery Mimarisi ve Çalışma Prensibi

Celery genel amacı olarak tasklar oluşturur ve bu taskları takip eder. Bu taskler bir decorator ile çevreleniyor.

Press enter or click to view image in full size
Görsel Egehan Gündoğdu’nun blog yazısından alınmıştır.

Bir script veya web uygulaması çalışacak olan task ve argümanlarını sağlar. Bu taskler tanımı itibarıyla Celery’nin tanıyabilmesi ve kayıt altında tutulabilmesi bakımından bir decorator ile çevrelenir. Yine bu script veya uygulama celery taskı harekete geçirir ve mesaj broker worker döngüsünü başlatır.

Uygulama tarafından çalıştırılması istenilen task ismiyle ve argümanlarıyla mesaj broker üzerine kaydedilir. Böylece uygulama yapacağı ağır işlemleri bir celery taskina taşere etmiş ve kullanıcıya iletilecek çıktıları yük oluşturmadan hızlıca dönmüş olacaktır.

Press enter or click to view image in full size

Producer (Görev Üreticisi)

Producer, görevleri (tasks) oluşturur ve mesaj broker’a gönderir. Celery’de genellikle Django uygulamasının bir parçası olarak çalışır.

Örneğin:

from myapp.tasks import send_email 

# Mesaj broker'a "send_email" görevinin yapılması gerektiğini bildiren bir mesaj gönderir.
send_email.delay("example@example.com")

Task (Görev)

Celery’de her bir iş, bir task olarak adlandırılır. Örneğin; task, belirli bir işlemi temsil eden bir Python fonksiyonudur ve Celery tarafından yönetilir. Taskalar senkron veya asenkron çalıştırılabilir.

  • Asenkron Çalışma: Görevler arka planda çalıştırılarak ana uygulamanın bloklanmasını önler.
  • Zamanlama (Scheduling): Görevlerin belirli zamanlarda çalıştırılması için zamanlama yapılabilir.
  • Kuyruk Atama: Her görev, belirli bir kuyruğa atanabilir.
from celery import Celery

app = Celery('my_app', broker='redis://localhost:6379/0')

@app.task
def add(x, y):
return x + y

# Görevi çağırmak
result = add.delay(4, 6) # Görev asenkron olarak kuyruğa eklenir.

Queue (Kuyruk)

Görevler, bir kuyrukta saklanır ve işçiler tarafından işlenmeyi bekler. Görevlerin sıralı bir şekilde bekletildiği bu veri yapısı queue olarak adlandırılır. Celery’de bir görev (task) tanımlandığında bu görevler, producerdan brokera (queue içine) iletilir; işçi süreçleri (workers) bu kuyruğu tüketerek görevleri işler ve işlenilen görevler workerdan alınır. Broker, tüm sistemi koordine ederek işlerin sırasının korunmasını sağlar ve iletilen görevleri işçilere dağıtır.

Press enter or click to view image in full size
resim-1

Celery’de birden fazla kuyruk tanımlanabilir ve her kuyruk belirli bir görev türüne atanabilir. Bu, görevlerin işlenmesini optimize etmek için kullanışlıdır.

Press enter or click to view image in full size
resim-2 (resim-1 ve resim-2 SKonik kanalının Python. Celery concepts animated videosundan alınmıştır.)

Broker (Aracı)

  • Mesaj broker, kuyruklar arasında görevleri yönlendirme işini yapar.

Broker uygulama ve worker arasında çift taraflı olarak çalışır.

Get Bilana Altay’s stories in your inbox

Join Medium for free to get updates from this writer.

Broker, görevlerin işlenmek üzere kuyruklara yönlendirildiği bir iletişim katmanıdır. Celery’nin broker kullanımı, görevlerin workerlara dağıtılmasını sağlar. Celery’nin çekirdeğinde broker, bir mesajlaşma sistemi olarak görev yapar ve görevleri şu şekilde yönetir:

  1. Üretici (producer) görevleri kuyruğa gönderir.
  2. Broker, bu görevleri kuyrukta saklar ve işçi süreçlerine (workers) iletir.
  3. Workerlardan gelen task durumlarını takip eder.
  4. Workerlar, broker’den görevleri alır ve işler.

En popüler broker seçenekleri:

  • RabbitMQ: Yüksek performanslı ve sağlamdır.
  • Redis: Hafif, kolay kurulabilir bir anahtar-değer veritabanıdır.
  • Amazon SQS, Kafka, ZeroMQ: Büyük ölçekli ve özelleştirilmiş sistemler için alternatiflerdir.

Consumer (Görev Tüketicisi)

Consumer, mesaj broker’dan gelen görevleri alır ve işçi (worker) süreçlerine iletir.

Worker (İşçi)

Celery workerlar ayrık bir şekilde senkron işlemleri gerçekleştirecektir. Kuyruğa bağlanır, görevleri alır ve işler. Sonsuz döngünün içinde “Bana verebileceğin bir iş var mı?” şeklinde sürekli queue ye soru soran makinelerden farklı bir şey değildir.

Worker, görevlerin gerçekleştirilmesini sağlayan bir tür “çalışan süreçtir”. Birden fazla worker çalıştırılarak sistem yatayda ölçeklendirilebilir. Örneğin, farklı worker’lar farklı kuyruklara bağlanarak görevleri paralel şekilde işleyebilir ve sonuç üretebilir.

Eğer task çalıştırılmaya başladığı anda herhangi bir worker müsait durumda değilse, task kuyrukta sırası korunarak kalacak, ilk müsait olan worker tarafından üstlenilecektir.

Worker’ın özellikleri:

  1. Görev Dinleme: Broker üzerinden gelen görevleri dinler.
  2. Görevi İşleme: Görev alındığında tanımlanan işlemi (task) çalıştırır.
  3. İşlem Durumu: Görevin başarılı veya hatalı olduğunu geri bildirir.

Worker’ı çalıştırmak için Celery CLI kullanılır:

celery -A my_app worker --loglevel=info
Andereas Jud’un How to set up Celery and Redis videosundan alınmıştır.

Celery Pool

Pool, işçilerin birbirleriyle nasıl etkileşimde bulunacağını ve kaynakları nasıl yöneteceğini belirler.

Celery’nin pool özelliği, aşağıdaki gibi çeşitli worker pool sunar:

Connection Pool (Bağlantı Havuzu)

  • Her producer ve consumer, broker’a bağlanmak için bir bağlantı kullanır.
  • Connection Pool, bu bağlantıları yönetir ve gereksiz bağlantıların oluşturulmasını önler.
  • Pool sayesinde, bağlantılar yeniden kullanılabilir, bu da performansı artırır ve gecikmeyi azaltır.

Prefork Pool (Varsayılan)

  • Prefork pool, her bir işçi için yeni bir işlem (process) başlatır. Bu, paralel çalışan çok sayıda bağımsız işçi işlemcisi oluşturur.
  • Genellikle işlem tabanlı paralel işleme için uygundur.
  • Performans açısından, çok çekirdekli sistemlerde daha iyi sonuçlar verir.
  • Memory kullanımı diğer havuz türlerine göre daha yüksektir çünkü her işlem kendi belleğini kullanır.
  • Bu pool türü, özellikle CPU-yoğun görevlerde iyi çalışır.

Eventlet Pool

  • Eventlet pool, yeşil işçiler (green workers) kullanarak görevleri işler. Yeşil işçiler, tek bir işleme içerisinde çok sayıda görev yapmayı sağlayan hafif işçilerdir.
  • Bu havuz türü, özellikle IO-bound (input/output odaklı) görevlerde, yani ağ istekleri, dosya okuma/yazma gibi işlemlerde kullanılır.
  • Memory kullanımı daha düşüktür, çünkü her işçi daha hafif çalışır ve her bir işçi aynı işleme içinde çalışır.

Gevent Pool

  • Gevent pool, Eventlet ile benzer şekilde, yeşil işçiler kullanarak asenkron işlemler yapar.
  • IO-bound görevler için tercih edilir, çünkü görevler hızlıca geçici olarak askıya alınabilir ve diğer görevler işlenebilir.
  • Eventlet’e benzer şekilde hafif işçi yapısı sunar ve düşük bellek kullanımı sağlar.

Solo Pool

  • Solo pool, yalnızca tek bir işçi (worker) kullanarak görevleri işler.
  • Genellikle test ortamlarında ya da düşük işlem hacmine sahip uygulamalarda kullanılır.
  • Paralel işleme yapılmaz, çünkü sadece tek bir işlem çalıştırılır.

Pool Yönetimi

  • Pool, belirli bir sayıda bağlantı oluşturur ve bunları paylaşır.
  • Pool kapasitesini aşan talepler bir bekleme sırasına alınır veya hata döner.

Celery’de pool seçimi, görevlerinizin doğasına ve sisteminizin kaynaklarına bağlı olarak önemli bir yapılandırma kararını oluşturur.

Özetle

Celery, dağıtılmış ve asenkron görev yönetimi için güçlü ve esnek bir araçtır. Sunduğu bu esneklik sayesinde, ölçeklenebilir bir yapı kurmak ve sistem kaynaklarını verimli bir şekilde kullanmak mümkün hale geliyor.

Özellikle Django ve Flask gibi popüler framework’lerle entegrasyonu sayesinde, projelerinizde Celery kullanarak karmaşık görevleri arka planda yönetebilir, uygulamanızın yanıt süresini kısaltabilir ve kullanıcı deneyimini ciddi ölçüde iyileştirebilirsiniz.

Ancak unutmamak gerekir ki, Celery’nin sağladığı kolaylıklar beraberinde bir karmaşıklık da getirebilir. Bu nedenle, her projede kullanılmadan önce “Gerçekten buna ihtiyacımız var mı?” sorusunu sormak önemlidir. Yanlış yapılandırılmış ya da gereksiz kullanıldığında, çözümden çok sorun yaratabilir. Doğru zamanda, doğru yerde ve doğru stratejiyle kullanıldığında ise, Celery projelerinizin en güçlü yardımcılarından biri olacaktır.