.NET ile Hangfire: Arka Plan Görevleri İçin Güvenilir Bir Çözüm
Modern web uygulamaları, kullanıcı deneyimini iyileştirmek için genellikle eşzamansız (asynchronous) ve arka plan görevlerine ihtiyaç duyar. E-posta gönderme, rapor oluşturma, veri senkronizasyonu veya periyodik temizlik işlemleri gibi görevler, ana uygulama iş parçacığını (thread) bloklamamalı ve kullanıcının beklemesine neden olmamalıdır. İşte tam bu noktada Hangfire devreye giriyor!
Bu blog yazısında, Hangfire'ın ne olduğunu, neden kullanmanız gerektiğini, başlıca avantajlarını ve özellikle ASP.NET Core uygulamalarınızla nasıl entegre edebileceğinizi kapsamlı bir şekilde inceleyeceğiz.
Hangfire Nedir?
Hangfire, .NET uygulamalarında arka plan görevlerini kolayca gerçekleştirmek, yönetmek ve izlemek için tasarlanmış açık kaynaklı, güvenilir ve kullanımı kolay bir kütüphanedir. Uygulama sunucunuzun çökmesi veya yeniden başlatılması durumunda bile görevlerinizin dayanıklı bir şekilde yürütülmesini sağlar. Hangfire, görevleri bir depolama katmanına (genellikle bir veritabanı) kaydeder, böylece uygulama yeniden başlatıldığında kaldığı yerden devam edebilir.
Neden Hangfire Kullanmalısınız?
Arka plan görevlerini manuel olarak yönetmek karmaşık ve hata eğilimli olabilir. Hangfire, bu süreci otomatikleştirerek ve basitleştirerek birçok avantaj sunar:
Dayanıklılık (Durability): Görevler veritabanında saklandığı için, uygulama çökerse veya sunucu yeniden başlatılırsa görevler kaybolmaz. Uygulama tekrar çalışmaya başladığında görevler yürütülmeye devam eder.
Kolay Kullanım: Sezgisel API'si sayesinde arka plan görevlerini tanımlamak ve kuyruğa almak son derece basittir. Tek satırlık kodlarla karmaşık görevler planlayabilirsiniz.
Çeşitli Görev Türleri: Hangfire; bir kerelik (fire-and-forget), gecikmeli (delayed), yinelenen (recurring) ve sürekli (continuation) görev türlerini destekler.
İzleme ve Yönetim Paneli: Dahili bir web UI paneli ile tüm arka plan görevlerinizi gerçek zamanlı olarak izleyebilir, yeniden deneyebilir (retry), silebilir veya manuel olarak tetikleyebilirsiniz. Bu panel, özellikle üretim ortamında büyük bir kolaylık sağlar.
Performans: Görevler ayrı iş parçacıklarında veya uzak sunucularda yürütülebilir, bu da ana uygulama yanıt süresini iyileştirir.
Depolama Çeşitliliği: SQL Server, Redis, PostgreSQL, MongoDB gibi çeşitli depolama arka uçlarını destekler.
Hangfire'ın Avantajları
Hangfire kullanmanın getirdiği başlıca avantajlar, uygulamanızın genel kalitesini ve yönetilebilirliğini artırır:
Kullanıcı Deneyimi İyileştirmesi: Uzun süren işlemleri arka plana taşıyarak kullanıcıların uygulama içinde hızlıca gezinmesini sağlar.
Kaynak Optimizasyonu: Yoğun CPU veya I/O gerektiren görevlerin ana uygulama sunucusundan bağımsız olarak yürütülmesine olanak tanır.
Otomasyon ve Güvenilirlik: Manuel müdahaleyi azaltır ve görevlerin belirlenen zamanlarda veya koşullarda güvenilir bir şekilde çalışmasını garanti eder.
Ölçeklenebilirlik: Birden fazla sunucu üzerinde çalışarak iş yükünü dağıtabilir ve uygulamanızın ölçeklenmesine yardımcı olur.
ASP.NET Core ile Hangfire Kullanımı
Hangfire'ı bir ASP.NET Core uygulamasına entegre etmek oldukça kolaydır. İşte adım adım temel bir kurulum:
1. NuGet Paketlerini Yükleme:
Öncelikle, projenize gerekli NuGet paketlerini eklemeniz gerekir:
Install-Package Hangfire.Core
Install-Package Hangfire.AspNetCore
Install-Package Hangfire.SqlServer # veya kullandığınız veritabanına uygun paket
2. Startup.cs (veya Program.cs) Konfigürasyonu:
Hangfire'ı Program.cs
(veya ASP.NET Core 5 ve öncesinde Startup.cs
) dosyanızda yapılandırmanız gerekir.
using Hangfire;
using Hangfire.SqlServer;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();
// Hangfire Servislerini Ekleme
builder.Services.AddHangfire(configuration => configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_180)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseSqlServerStorage(builder.Configuration.GetConnectionString("HangfireConnection"), new SqlServerStorageOptions
{
CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
QueuePollInterval = TimeSpan.Zero,
UseRecommendedIsolationLevel = true,
DisableGlobalLocks = true // Distributed environments
}));
// Hangfire Server'ı Ekleme (arka plan görevlerini işleyecek servis)
builder.Services.AddHangfireServer();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
// Hangfire Dashboard'ı Ekleme (isteğe bağlı, ancak şiddetle tavsiye edilir)
app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
// Dashboard'a erişimi kısıtlamak için kimlik doğrulama ekleyebilirsiniz.
// Dashboard'ı sadece geliştirme ortamında göstermek de iyi bir pratiktir.
// Authorization = new [] { new MyAuthorizationFilter() }
});
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
// Örnek Arka Plan Görevleri Oluşturma
app.MapGet("/send-email", () =>
{
BackgroundJob.Enqueue(() => Console.WriteLine("E-posta gönderildi!"));
return "E-posta gönderme görevi kuyruğa alındı.";
});
app.MapGet("/schedule-report", () =>
{
BackgroundJob.Schedule(() => Console.WriteLine("Rapor gecikmeli olarak oluşturuldu!"), TimeSpan.FromMinutes(1));
return "Rapor görevi 1 dakika sonra çalışacak şekilde planlandı.";
});
app.MapGet("/daily-backup", () =>
{
// Her gün saat 03:00'te çalışacak bir görev
RecurringJob.AddOrUpdate("daily-backup", () => Console.WriteLine("Günlük yedekleme yapıldı!"), Cron.Daily(3, 0));
return "Günlük yedekleme görevi ayarlandı.";
});
app.Run();
3. Connection String Ekleme:
appsettings.json
dosyanıza Hangfire'ın kullanacağı veritabanı bağlantı dizesini ekleyin:
{
"ConnectionStrings": {
"HangfireConnection": "Server=(localdb)\\mssqllocaldb;Database=HangfireDb;Integrated Security=True;"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
Uygulamanızı ilk çalıştırdığınızda, Hangfire gerekli tabloları veritabanında otomatik olarak oluşturacaktır.
4. Arka Plan Görevlerini Tanımlama:
Yukarıdaki Program.cs
örneğinde gösterildiği gibi, BackgroundJob
sınıfını kullanarak farklı türde görevler tanımlayabilirsiniz:
BackgroundJob.Enqueue(() => Console.WriteLine("Mesaj"));
: Bir kerelik görev. Hemen yürütülür.BackgroundJob.Schedule(() => Console.WriteLine("Mesaj"), TimeSpan.FromDays(1));
: Gecikmeli görev. Belirli bir süre sonra yürütülür.RecurringJob.AddOrUpdate("gorev-id", () => Console.WriteLine("Mesaj"), Cron.Hourly());
: Yinelenen görev. Belirli bir CRON ifadesine göre düzenli olarak yürütülür.
5. Hangfire Dashboard'a Erişim:
Uygulamanızı çalıştırdıktan sonra https://localhost:[port]/hangfire
adresine giderek Hangfire Dashboard'a erişebilirsiniz. Bu panelde aktif, başarılı, başarısız ve kuyruktaki tüm görevlerinizi görebilir, yönetebilirsiniz.
Sonuç
Hangfire, .NET geliştiricileri için arka plan görev yönetimini kökten basitleştiren ve güvenilirliğini artıran paha biçilmez bir araçtır. Dayanıklılığı, esnek görev türleri, kapsamlı izleme paneli ve ASP.NET Core ile sorunsuz entegrasyonu sayesinde, uygulamanızın performansını ve kullanıcı deneyimini önemli ölçüde iyileştirebilirsiniz.
Uygulamalarınıza uzun süren veya periyodik işlemler eklemeyi düşünüyorsanız, Hangfire kesinlikle listenizin başında olmalı!