Skip to content

Hangfire

Giriş

Hangfire, .NET uygulamaları için açık kaynaklı bir background job processing framework'üdür. Zamanlanmış işler, tekrarlayan görevler ve arka plan işlemleri için güvenilir ve ölçeklenebilir bir çözüm sunar.

Hangfire'ın Önemi

  1. Güvenilirlik
  2. İşlem kalıcılığı
  3. Otomatik yeniden deneme
  4. Hata yönetimi
  5. İşlem izlenebilirliği

  6. Ölçeklenebilirlik

  7. Çoklu sunucu desteği
  8. Yük dengeleme
  9. Queue yönetimi
  10. Cluster desteği

  11. Kullanım Kolaylığı

  12. Kolay kurulum
  13. Zengin API
  14. Dashboard
  15. Detaylı dokümantasyon

Hangfire Özellikleri

  1. Job Tipleri
  2. Fire-and-forget jobs
  3. Delayed jobs
  4. Recurring jobs
  5. Continuations
  6. Batches

  7. Storage Seçenekleri

  8. SQL Server
  9. Redis
  10. MongoDB
  11. PostgreSQL
  12. MSMQ

  13. Monitoring

  14. Web Dashboard
  15. Job durumu takibi
  16. Performans metrikleri
  17. Hata izleme

Hangfire Kullanımı

  1. Temel Kurulum

    // NuGet paketleri:
    // Hangfire
    // Hangfire.AspNetCore
    // Hangfire.SqlServer
    
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddHangfire(config => config
                .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
                .UseSimpleAssemblyNameTypeSerializer()
                .UseRecommendedSerializerSettings()
                .UseSqlServerStorage(Configuration.GetConnectionString("HangfireConnection")));
    
            services.AddHangfireServer();
        }
    
        public void Configure(IApplicationBuilder app)
        {
            app.UseHangfireDashboard();
        }
    }
    

  2. Fire-and-Forget Job

    public class EmailService
    {
        private readonly IBackgroundJobClient _backgroundJobClient;
    
        public EmailService(IBackgroundJobClient backgroundJobClient)
        {
            _backgroundJobClient = backgroundJobClient;
        }
    
        public void SendEmail(string to, string subject, string body)
        {
            _backgroundJobClient.Enqueue(() => SendEmailAsync(to, subject, body));
        }
    
        public async Task SendEmailAsync(string to, string subject, string body)
        {
            // E-posta gönderme işlemi
            await Task.Delay(1000); // Simülasyon
        }
    }
    

  3. Delayed Job

    public class NotificationService
    {
        private readonly IBackgroundJobClient _backgroundJobClient;
    
        public NotificationService(IBackgroundJobClient backgroundJobClient)
        {
            _backgroundJobClient = backgroundJobClient;
        }
    
        public void ScheduleNotification(string userId, string message, TimeSpan delay)
        {
            _backgroundJobClient.Schedule(
                () => SendNotificationAsync(userId, message),
                delay);
        }
    
        public async Task SendNotificationAsync(string userId, string message)
        {
            // Bildirim gönderme işlemi
            await Task.Delay(1000); // Simülasyon
        }
    }
    

  4. Recurring Job

    public class ReportService
    {
        private readonly IRecurringJobManager _recurringJobManager;
    
        public ReportService(IRecurringJobManager recurringJobManager)
        {
            _recurringJobManager = recurringJobManager;
        }
    
        public void ScheduleDailyReport()
        {
            _recurringJobManager.AddOrUpdate(
                "daily-report",
                () => GenerateDailyReportAsync(),
                Cron.Daily);
        }
    
        public async Task GenerateDailyReportAsync()
        {
            // Günlük rapor oluşturma işlemi
            await Task.Delay(5000); // Simülasyon
        }
    }
    

  5. Job Continuations

    public class OrderService
    {
        private readonly IBackgroundJobClient _backgroundJobClient;
    
        public OrderService(IBackgroundJobClient backgroundJobClient)
        {
            _backgroundJobClient = backgroundJobClient;
        }
    
        public void ProcessOrder(string orderId)
        {
            var jobId = _backgroundJobClient.Enqueue(() => ValidateOrderAsync(orderId));
            _backgroundJobClient.ContinueWith(jobId, () => ProcessPaymentAsync(orderId));
            _backgroundJobClient.ContinueWith(jobId, () => SendConfirmationAsync(orderId));
        }
    
        public async Task ValidateOrderAsync(string orderId)
        {
            // Sipariş doğrulama
            await Task.Delay(1000);
        }
    
        public async Task ProcessPaymentAsync(string orderId)
        {
            // Ödeme işlemi
            await Task.Delay(1000);
        }
    
        public async Task SendConfirmationAsync(string orderId)
        {
            // Onay gönderme
            await Task.Delay(1000);
        }
    }
    

Hangfire Best Practices

  1. Job Tasarımı
  2. Idempotent işlemler
  3. Küçük ve odaklı joblar
  4. Hata yönetimi
  5. İşlem durumu takibi

  6. Performans

  7. Queue yönetimi
  8. Worker sayısı optimizasyonu
  9. Batch işlemler
  10. Kaynak kullanımı

  11. Güvenlik

  12. Dashboard erişim kontrolü
  13. Job doğrulama
  14. Veri güvenliği
  15. Audit logging

  16. Monitoring

  17. Job durumu takibi
  18. Performans metrikleri
  19. Hata izleme
  20. Alerting

Mülakat Soruları

Temel Sorular

  1. Hangfire nedir ve neden kullanılır?
  2. Cevap: Hangfire, .NET uygulamaları için açık kaynaklı bir background job processing framework'üdür. Zamanlanmış işler, tekrarlayan görevler ve arka plan işlemleri için güvenilir ve ölçeklenebilir bir çözüm sunar.

  3. Hangfire'ın temel özellikleri nelerdir?

  4. Cevap:

    • Fire-and-forget jobs
    • Delayed jobs
    • Recurring jobs
    • Continuations
    • Batches
    • Web Dashboard
    • Çoklu storage desteği
  5. Hangfire'ın avantajları nelerdir?

  6. Cevap:

    • Güvenilirlik
    • Ölçeklenebilirlik
    • Kullanım kolaylığı
    • Zengin özellik seti
    • Detaylı dokümantasyon
  7. Hangfire'da job tipleri nelerdir?

  8. Cevap:

    • Fire-and-forget jobs: Hemen çalıştırılan işler
    • Delayed jobs: Belirli bir süre sonra çalıştırılan işler
    • Recurring jobs: Periyodik olarak çalıştırılan işler
    • Continuations: Başka bir job'ın tamamlanmasına bağlı işler
    • Batches: Toplu işlemler
  9. Hangfire'da storage seçenekleri nelerdir?

  10. Cevap:
    • SQL Server
    • Redis
    • MongoDB
    • PostgreSQL
    • MSMQ

Teknik Sorular

  1. Hangfire nasıl yapılandırılır?
  2. Cevap:

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddHangfire(config => config
                .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
                .UseSimpleAssemblyNameTypeSerializer()
                .UseRecommendedSerializerSettings()
                .UseSqlServerStorage(Configuration.GetConnectionString("HangfireConnection")));
    
            services.AddHangfireServer();
        }
    
        public void Configure(IApplicationBuilder app)
        {
            app.UseHangfireDashboard();
        }
    }
    

  3. Fire-and-forget job nasıl oluşturulur?

  4. Cevap:

    public class EmailService
    {
        private readonly IBackgroundJobClient _backgroundJobClient;
    
        public EmailService(IBackgroundJobClient backgroundJobClient)
        {
            _backgroundJobClient = backgroundJobClient;
        }
    
        public void SendEmail(string to, string subject, string body)
        {
            _backgroundJobClient.Enqueue(() => SendEmailAsync(to, subject, body));
        }
    }
    

  5. Recurring job nasıl oluşturulur?

  6. Cevap:

    public class ReportService
    {
        private readonly IRecurringJobManager _recurringJobManager;
    
        public ReportService(IRecurringJobManager recurringJobManager)
        {
            _recurringJobManager = recurringJobManager;
        }
    
        public void ScheduleDailyReport()
        {
            _recurringJobManager.AddOrUpdate(
                "daily-report",
                () => GenerateDailyReportAsync(),
                Cron.Daily);
        }
    }
    

  7. Job continuations nasıl kullanılır?

  8. Cevap:

    public class OrderService
    {
        private readonly IBackgroundJobClient _backgroundJobClient;
    
        public OrderService(IBackgroundJobClient backgroundJobClient)
        {
            _backgroundJobClient = backgroundJobClient;
        }
    
        public void ProcessOrder(string orderId)
        {
            var jobId = _backgroundJobClient.Enqueue(() => ValidateOrderAsync(orderId));
            _backgroundJobClient.ContinueWith(jobId, () => ProcessPaymentAsync(orderId));
            _backgroundJobClient.ContinueWith(jobId, () => SendConfirmationAsync(orderId));
        }
    }
    

  9. Hangfire'da hata yönetimi nasıl yapılır?

  10. Cevap:
    public class JobErrorHandler
    {
        private readonly ILogger _logger;
        private readonly IBackgroundJobClient _backgroundJobClient;
    
        public JobErrorHandler(ILogger<JobErrorHandler> logger, IBackgroundJobClient backgroundJobClient)
        {
            _logger = logger;
            _backgroundJobClient = backgroundJobClient;
        }
    
        public void HandleJobError(string jobId, Exception ex)
        {
            _logger.LogError(ex, "Job {JobId} failed", jobId);
    
            if (ex is TransientException)
            {
                _backgroundJobClient.Schedule(() => RetryJob(jobId), TimeSpan.FromMinutes(5));
            }
        }
    }
    

İleri Seviye Sorular

  1. Hangfire'da performans optimizasyonu nasıl yapılır?
  2. Cevap:

    • Queue yönetimi
    • Worker sayısı optimizasyonu
    • Batch işlemler
    • Kaynak kullanımı
    • Storage optimizasyonu
  3. Hangfire'da güvenlik nasıl sağlanır?

  4. Cevap:

    • Dashboard erişim kontrolü
    • Job doğrulama
    • Veri güvenliği
    • Audit logging
    • Güvenlik izleme
  5. Hangfire ile distributed sistemler nasıl yönetilir?

  6. Cevap:

    • Çoklu sunucu yapılandırması
    • Queue yönetimi
    • Load balancing
    • Failover stratejileri
    • Consistency yönetimi
  7. Hangfire'da monitoring nasıl yapılır?

  8. Cevap:

    • Web Dashboard kullanımı
    • Job durumu takibi
    • Performans metrikleri
    • Hata izleme
    • Alerting
  9. Hangfire'da scaling nasıl yapılır?

  10. Cevap:
    • Worker sayısı artırma
    • Queue sayısı artırma
    • Storage optimizasyonu
    • Load balancing
    • Resource allocation