Öncelikle cron job’ların ve queue’ların farklı çözümler olduğunu düşünüyordum. Ancak, bu ikisinin rekabet halinde olmadığını, birlikte çalışmaları gerektiğini fark ettim. Otomatik yenileme faturalama sistemini içeren SubEngine projemde, cron job’ları ile queue’ları birleştirmenin yüksek verimli olduğunu keşfettim. Cron zamanlama görevlerini, queue ise olayları yönetir.
İşte bu iki işin nasıl paylaştırıldığı ve bu yaklaşımın neden dayanıklı olduğu:
Cron ve Queue
Cron ve Queue
- Cron bir zamanlayıcı olarak çalışır. “Her gün gece yarısı, X’i yap.”
- Queue bir olayla çalışır. “Bu olay gerçekleşti, bunu hallet.”
Bu iki çözüm ilk bakışta farklı gibi görünse de, birlikte uygulamak son derece verimli bir sistem yaratmaktadır. Bu konuya SubEngine’de nasıl yanaştığımı açıklayacağım.
Benim Sistemim (SubEngine)
Benim Sistemim (SubEngine)
SubEngine’de, otomatik yenileme seçeneği etkinleştirilmiş her abonelik, süresi dolmadan bir gün önce yenileme denemesine tabi tutulur. Yenileme başarılı ya da başarısız olduğunda kullanıcıya bir e-posta gönderilir. İş dağılımı şu şekildedir:
Cron job’ın görevi, kimin yenilemeye ihtiyacı olduğunu bulmak ve bunu denemektir. E-posta göndermaz. Yenileme denemesi tamamlandığında, sonucun başarılı ya da başarısız olması bir olay haline gelir. Olay queue’ya yüklendiğinde, queue kullanıcıya e-postayı gönderir.
Cron asla e-posta işlemlerine karışmaz. Queue ise yenileme mantığıyla ilgilenmez. İki iş, iki sorumluluk, hiçbir örtüşme yoktur.
Bu Dağılım Neden Önemli?
Bu Dağılım Neden Önemli?
Eğer cron doğrudan e-posta gönderirse, bir sonraki kullanıcıya geçmeden önce e-posta sağlayıcınızın yanıt vermesini beklemek zorundadır. Sağlayıcı yavaşsa ya da kapalıysa, tüm yenileme işlemi yavaşlar veya başarısız olur.
E-posta yükünü queue’ya atarak, cron hızlı ve basit kalır, aynı zamanda queue, e-posta başarısız olursa yeniden denemeleri yönetebilir; yenileme mantığını hiç etkileyemez. Böylece bağımsız olarak başarısız olabilen iki sistem oluşturulur ve biri diğerini etkilemez.
Ölçeklendirme Üzerine Kısa Bir Not
Ölçeklendirme Üzerine Kısa Bir Not
Bu sistem, makul bir kullanıcı sayısında oldukça iyi çalışıyor. Ancak, aynı anda binlerce aboneliğin yenilenmesi durumunda, cron yavaşlamaya başlar ve her şey fazla iş yükü altında kalır.
Çözüm: Yenileme işlemini cron job içinde gerçekleştirmeyin. Cron, yenileme gerektirenleri bulsun ve ardından her kullanıcı için queue’ya bir iş yollasın:
Subscription::dueTomorrow()->lazy()->each(function ($subscription) {
ProcessRenewal::dispatch($subscription);
});
Artık cron’un tek görevi, kimin kontrol edilmesi gerektiğine karar vermektir. Gerçek yenileme işlemi paralel olarak queue çalışanlarında gerçekleşir. Cron daha hızlı hale gelir ve sisteminiz yeniden yazılmadan ölçeklenebilir.
Sonuç
Sonuç
Cron ne zaman yapılacağını belirler. Queue ise sonraki adımın ne olacağını belirler. Bu ayrım, sistemi hızlı ve güvenilir kılar.
Detaylı bir uygulama görmek istiyorsanız, SubEngine’i inceleyebilirsiniz. Eğer bu problemi farklı bir şekilde çözüyorsanız, yönteminizi öğrenmek isterim.
Kaynak: Orijinal Makale



