Hangfire Nedir? .NET Core 3.x Üzerinde Kullanımı
Hangfire Nedir?
Hangfire, arkaplanda çalışacak olan bazı işleri yaratıp, yürütmeyi ve yönetmeyi sağlayan açık kaynaklı bir kütüphanedir.
Neden Hangfire Kullanmalısınız?
İş akış sürecinizde bazen bazı işlerin arka planda gerçekleşmesi gerektiği durumlar olabilir veya haftalık, günlük olarak belli zaman aralıklarında bir işlemi tekrar edecek şekilde yaptırmak isteyebilirsiniz. Örneğin: haftalık bülten abonesi olmuş kullanıcılara belirleyeceğiniz belli bir günde e-mail atmak gibi yineleyen işlemler bu kapsamda değerlendirilebilir.
Hangfire kullanmanın faydaları nelerdir?
- Kendi içerisinde sunmuş olduğu dashboard sayesinde, daha kolay yönetilebilir ve görünürlük sağlar.
- Uygulamanızdan bağımsız bir şekilde çalışabilir.
- Yapmış olduğu her bir işin bilgisini veri tabanında tuttuğu için bir bütünlük sağlar, ayrıca herhangi bir sorun olması halinde tekrar tekrar denemeyi sağlar.
Hangfire’a Alternatif Kütüphaneler
Hangfire’a alternatif olabilecek kütüphanelerden bazılarını aşağıda görebilirsiniz.
- RabbitMQ
- Azure Functions
- NServiceBus
- Kafka
- Sidekiq
Hangfire Job Çeşitleri
- Fire & Forget: Bir kez ve anında çalışacak olan job çeşididir.
- Delayed: Belirtilen sürenin sonunda bir defaya mahsus çalışacak olan job çeşididir.
- Recurring: Recursive olarak devamlı çalışacak olan job çeşididir.
- Continuations: Daha önceden tanımlanmış olan job’ın (scheduled) başarılı şekilde çalışması durumunda çalışacak olan job çeşididir.
.NET Core 3.x Üzerinde Hangfire Kurulumu & Kullanımı
Öncelikle hızlıca .NET Core API projemizi oluşturalım. Ardından proje üzerinde sağ tıklayıp, “Manage Nuget Packages…” bölümüne tıklayalım ve açılan bölüm içerisinde Browse sekmesinden Hangfire’ı arattıralım. Aşağıdaki gibi bir görsel ile karşılaşacağız, “Install” butonuna tıklayarak kuralım.
Hangfire kurulduktan sonra, proje içerisindeki “Startup.cs” dosyasına gidip aşağıdaki kodları ekleyelim.
services.AddHangfire(x =>
x.UseSqlServerStorage(“Server=.;Database=HangfireDemo;Trusted_Connection=
True;MultipleActiveResultSets=true”));
services.AddHangfireServer();
NOT: Yukarıda görmüş olduğunuz kod satırları içerisinde veritabanı bağlantısı için connection string belirttik. Bunun sebebi; Hangfire tüm işlemlerin bütünlüğünü sağlamak adına kendi veritabanını oluşturup, oradan yönetimini sağlamakta. Bu sayede projeniz düştüğünde veya herhangi bir olumsuz durumda job’larınız kaybolmamakta, kalıcılığı (persistent) sağlanmakta.
Ardından aynı dosya içerisinde “Configure” altına, Hangfire’ın bize sunmuş olduğu görsel panelini kullanabilmemiz için aşağıdaki kodu da ekleyelim.
app.UseHangfireDashboard();
Öyleyse “Run” butonuna basıp neler oluyor bir görelim. İlk başta başlangıç URL’i ne ise oradan başlayacaktır. Bu yüzden URL’e “../hangfire” yazıp Hangfire’ın dashboard’ına bağlanabiliriz. Şöyle ki:
Bu ekranı gördükten sonra test olarak bir controller ekleyelim ve içerisine ilk olarak test edeceğimiz fire & forget job’ıyla ilgili kodları ekleyelim:
BackgroundJob.Enqueue(..); satırı ile kullanıcı sisteme kayıt olduktan sonra bir defaya mahsus olarak çalışacak olan bir job oluşturup, tetiklenecek fonksiyonu belirtiyorum. Bu sayede arka planda bir job oluşturup asenkron olarak bağımsız çalıştırmış oluruz. Sign up süresi de uzamamış olur.
Postman üzerinden aşağıdaki şekilde endpoint’e istekte bulunarak test edebilirsiniz.
Delayed job, job oluşturulduktan belirli bir süre sonra tetiklenen ve çalışan bir job çeşididir. Aşağıdaki örnekte 30 sn sonra çalışan bir delayed job ‘a ait örnek kod satırını görebilirsiniz.
Marketing e-maili’nin her hafta pazartesi günü saat 09:30’da gönderilmesi için oluşturduğumuz recurring job örnek kod satırı aşağıdadır.
Bu sefer oluşturmuş olduğumuz job, “Jobs” sekmesi altında değil “Recurring Jobs” altında gözükecektir. Ayrıca job’ın üzerine tıklayarak detaylı bilgisi görüntülenebilir.
Job’ı manuel olarak test etme amaçlı, direkt “Trigger now” butonuna tıklayarak çalıştırabilirsiniz.
“jobs” sekmesi altındaki “succeeded” alanında başarılı job’lar görüntülenebilir.
Ayrıca Pazar günü bu yazıyı yazdığım için yukarıdaki görselde “Next execution” sütununda bir gün sonra yazıyor. Not olarak ekleyeyim, karışıklık olmasın dedim J.
Bu yazıda son olarak anlatacağım bir diğer job tipi ise “Continuations” job’ı. Hatırlayacağınız üzere bir job’ın başarılı olarak çalıştırılıp bitirilmesine bağlı olarak başka bir job’ı oluşturabiliyorduk. Buna göre aşağıdaki görselde nasıl oluşturmuşuz bir göz atalım:
Bağlayacağımız job’ın id’sini bir değişkene atıp, parametre olarak ContinueJobWith(); fonksiyonuna geçiyoruz. Böylelikle zincir şeklinde başarı durumuna göre başka bir job oluşturmuş olduk.
Hangfire hakkında daha detaylı bilgi için https://www.hangfire.io/ adresini ziyaret edebilirsiniz. Umarım sizler için başlangıç olması açısından güzel bir yazı olmuştur.