Asp.NET Core’da Hangfire Kütüphanesi İle Zamanlanmış Görevler Oluşturma
Merhaba,
Bu içeriğimizde; Asp.NET Core uygulamalarında Background Jobs(Arka plan İşleri) gerçekleştirebilmek için bir açık kaynak kütüphanesi olan Hangfire’i inceliyor olacağız. Hangfire; çok yabancı olmadığımız ve zamanında hakkında detaylı makale yazdığımız Quartz.Net kütüphanesinin güzel bir muadilidir diyebiliriz.
Background Jobs Nedir?
Arka plan işleri olarak nitelendirilen Background Jobs aslında zamanlanmış görevlerin ta kendisidir. Bazen uygulamalarımızın ana thread dışında bir task işlemesi yahut senaryo gereği belli aralıklarla belli işlemlerin gerçekleştirilmesi gerekebilmektedir. İşte bu tarz ihtiyaçlara istinaden gerçekleştirilen zamanlanmış görevleri background jobs diyerek tarif etmekteyiz.
Hangfire’ın Avantajları Nelerdir?
- Oldukça kolay kullanıma ve yönetilebilirliğe sahiptir.
- Hangfire, veritabanı ile otomatik entegrasyon sağladığı için tanımlanan işlere ait tüm kayıtları fiziksel olarak tutmaktadır. Dolayısıyla bir iş tam teferruatıyla tamamlanmadan geçilmeyecek, süreçteki olası hatalarla karşılaşılma durumunda iş tekrardan çalıştırılacak ve işe dair son noktayı koymaksızın bu süreç böyle devam edecektir. Dolayısıyla fiziksel kayıt söz konusu olduğundan dolayı iş güvenliği hat safhada sunulmaktadır.
Hangfire Nasıl Çalışır? Mimarisi Nasıldır?
Hangfire; clienttan alınan görevleri “Hangfire Job Storage(Hangfire İş Deposu)” isimli alanda depolayarak sıraya alır. Server tarafından ilgili depodaki işler sırasıyla tek tek alınarak arka planda işlenir ve sonuç olarak clienta haber gönderir.
Projeye Hangfire Entegrasyonu
Asp.NET Core projesine Hangfire’ı entegre edebilmek için ilgili projenin ana dizinine odaklanmış powershell ekranında aşağıdaki komutu çalıştırmanız yeterli olacaktır.
dotnet add package Hangfire
Bu işlemden sonra Hangfire kütüphanesi projeye entegre edilmiş olacaktır.
Hangfire Kurulumu
Entegre ettiğimiz Hangfire kütüphanesini Asp.NET Core projesinde aktif hale getirebilmek için ilk olarak Hangfire’ın kullanacağı veritanını oluşturmamız gerekmektedir.
Hangfire; arka planda gerçekleşecek olan işleri sıralı bir şekilde kayda almak ve sonuçlarını takip edebilmek için fiziksel olarak bu veritabanını kullanacaktır. Uygulama ilk ayağa kalktığında Hangfire yapılanması ilgili veritabanında kendisine ait tabloların var olup olmadığını check etmekte, eğer yoksa anında migrate etmektedir. Evet, zaten birazdan bu durumuda gözlemleyeceğiz 🙂
Sıra veritabanı providerını “appsettings.json” dosyasına eklemeye geldi.
{ "ConnectionString": "Server=.;Database=HangfireDB;Trusted_Connection=True;" }
Bu işlemden sonra Hangfire kütüphanesini servis olarak uygulamaya dahil etmek ve nimetlerinden faydalanabilmek için “Startup.cs” dosyasında aşağıdaki çalışmaları gerçekleştirelim.
public class Startup { public IConfiguration Configuration { get; set; } public Startup(IConfiguration configuration) { Configuration = configuration; } public void ConfigureServices(IServiceCollection services) { services.AddHangfire(_ => _.UseSqlServerStorage(Configuration.GetValue<string>("ConnectionString"))); services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) app.UseDeveloperExceptionPage(); app.UseHangfireDashboard(); app.UseHangfireServer(); app.UseMvc(_ => _.MapRoute( name: "Default", template: "{controller=Home}/{action=Index}/{id?}" )); } }
Yukarıdaki kod bloğunu incelerseniz eğer;
“ConfigureServices” metodunda “AddHangfire” fonksiyonu ile Hangfire kütüphanesinin kullanacağı SQL Server Storage’ini belirlemekteyiz. “Configure” metodunda ise “UseHangfireDashboard” ve “UseHangfireServer” middlewarelerini devreye sokarak Hangfire kütüphanesinin Dashboard özelliğiyle birlikte Hangfire Server’ı uygulamada kullanılabilir hale getiriyoruz.
Hangfire dashboard’unda neler var? sorunuzu duyar gibiyim… Bir kaç satır sonra dashboard yapısını inceleyeceğiz lakin şimdi bu noktaya kadar yaptığımız çalışmayı ayağa kaldırarak Hangfire kütüphanesinin tablolarının migrate edildiğini ve temel yapılanmasının sıkıntısız aktifleştirildiğini göstermek istiyorum.
Yukarıdaki ekran görüntüsünde olduğu gibi Hangfire yapacağı işleri fiziksel olarak tutacağı tüm veritabanı yapılanmasını otomatik migrate etmiş bulunmaktadır. Burada önceki satırlarda bahsettiğim durumu tekrarlamak istiyorum ki; ilgili tablolar silindiği taktirde bir sonraki uygulamanın ayağa kalkması durumunda, check sonucunda tekrardan migrate edileceklerdir.
Hangfire Dashboard Yapısı
- Jobs
Sürece dahil olan tüm işlemleri durumlarıyla birlikte takip edebildiğimiz sekmedir;- Enqueued, sıradaki işleri
- Scheduled, ileri tarihe ayarlanmış işleri
- Processing, o anda işlemde olan/çalışan işleri
- Succeeded, başarılı bir şekilde tamamlanmış işleri
- Failed, başarısız olmuş işleri
- Deleted, silinmiş işleri
- Awaiting, sırasını bekleyen işleri
gösterir.
- Retries
Tanımlanmış işlerden olası hatalar sonucu tekrara düşenleri gördüğümüz sekmedir. Bir işin kaçıncı kez tekrara girdiği görülebilir. Varsayılan olarak tekrar sayısı 10’dur. - Recurring Jobs
Tekrarlı tanımlanmış işlerin görüldüğü sekmedir. Her ne kadar ayarlanmış tekrar söz konusu olsada Trigger ile istenildiği an tetiklenebilir. - Servers
Kullanılan Hangfire sunucularını görebildiğimiz sekmedir.
Görev Oluşturma
Hangfire ile dört farklı aksiyonda görev oluşturulabilmektedir. Şimdi gelin bu aksiyonları tek tek inceleyelim;
- Fire-And-Forget Jobs
İş tanımlanır ve hemen ardından bir kereye mahsus tetiklenir.Hangfire.BackgroundJob.Enqueue(() => Console.WriteLine("Fire-And-Forget Jobs tetiklendi"));
- Recurring Jobs
Belirlenen CRON zamanlamasına göre tekrarlanan işler tanımlanır.Hangfire.RecurringJob.AddOrUpdate(() => Console.WriteLine("Recurring jobs tetiklendi!"), Hangfire.Cron.MinuteInterval(1));
- Delayed Jobs
Oluşturulduktan belirli bir zaman sonra sadece bir seferliğine tetiklenecek olan görevler tanımlanır.Hangfire.BackgroundJob.Schedule(() => Console.WriteLine("Delayed jobs tetiklendi!"), TimeSpan.FromSeconds(10));
Örneğin, yukarıdaki kod bloğundaki görev register edildikten 10 saniye sonra tetiklenecektir.
- Continuations
Birbiriyle ilişkili işlerin olduğu durumlarda alınan aksiyondur. Bir jobun tetiklenebilmesi için bir öncekinin tamamlanması gerekmektedir.var parentJobId = Hangfire.BackgroundJob.Schedule(() => Console.WriteLine("1. Job"), TimeSpan.FromSeconds(10)); //Continuations job Hangfire.BackgroundJob.ContinueWith(parentJobId, () => Console.WriteLine("2. Job"));
Evet… Bu noktadan itibaren Asp.NET Core uygulamalarında zamanlanmış görevlerin Hangfire ile tam teferruatlı nasıl gerçekleştirilebileceğini incelemiş bulunmaktayız. İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
Merhabalar hocam iyi çalışmalar dilerim.
SMS ve Email bildirimleri için hangfire mi yoksa rabbitmq mu tavsiye edersiniz ?
Teşekkürler
Merhaba Ahmet bey,
SMS ve Email işlemleri zamanlama gerektiren bir göreve bağlıysa eğer tabi ki de Hangfire, yok eğer bu işlemler belirli aksiyonlar neticesinde gerçekleşecekse o zaman sistemi ölçekleyebilmek ve kullanıcı deneyimi açısından daha performanslı bir hizmet sağlayabilmek için RabbitMQ’yu tavsiye ederim.
Sevgiler…