Skip to content

Background Jobs

Giriş

Background Jobs (Arka Plan İşleri), uygulamanın ana iş akışından bağımsız olarak çalışan, genellikle zaman uyumsuz (asynchronous) ve uzun süren işlemlerdir. .NET uygulamalarında e-posta gönderimi, rapor oluşturma, veri işleme gibi işlemler için kullanılır.

Background Jobs'ın Önemi

  1. Performans
  2. Ana iş akışını bloklamama
  3. Kaynak kullanımı optimizasyonu
  4. Yük dengeleme
  5. Ölçeklenebilirlik

  6. Güvenilirlik

  7. Hata yönetimi
  8. Yeniden deneme mekanizmaları
  9. İş durumu takibi
  10. İşlem izlenebilirliği

  11. Kullanıcı Deneyimi

  12. Hızlı yanıt süreleri
  13. Asenkron işlem bildirimleri
  14. İşlem durumu takibi
  15. Kullanıcı geri bildirimi

Background Jobs Araçları

  1. Hangfire
  2. Kolay kurulum
  3. Zengin özellik seti
  4. Dashboard
  5. Persistence desteği

  6. Quartz.NET

  7. Güçlü zamanlama
  8. Cluster desteği
  9. İşlem yönetimi
  10. Plugin mimarisi

  11. Azure WebJobs

  12. Azure entegrasyonu
  13. Otomatik ölçeklendirme
  14. Monitoring
  15. Logging

Background Jobs Kullanımı

  1. Hangfire Kurulumu

    // 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. Background Job Oluşturma

    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. Zamanlanmış 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
        }
    }
    

  4. Job İzleme

    public class JobMonitor
    {
        private readonly IMonitoringApi _monitoringApi;
    
        public JobMonitor(IMonitoringApi monitoringApi)
        {
            _monitoringApi = monitoringApi;
        }
    
        public async Task<JobStatus> GetJobStatus(string jobId)
        {
            var job = await _monitoringApi.JobDetails(jobId);
            return new JobStatus
            {
                State = job.History[0].StateName,
                CreatedAt = job.CreatedAt,
                StartedAt = job.StartedAt,
                CompletedAt = job.CompletedAt
            };
        }
    }
    

Background Jobs 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. Kaynak kullanımı optimizasyonu
  8. Batch işlemler
  9. Ölçeklendirme stratejileri
  10. Queue yönetimi

  11. Güvenlik

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

  16. Monitoring

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

Mülakat Soruları

Temel Sorular

  1. Background Jobs nedir ve neden kullanılır?
  2. Cevap: Background Jobs, uygulamanın ana iş akışından bağımsız olarak çalışan, genellikle zaman uyumsuz ve uzun süren işlemlerdir. E-posta gönderimi, rapor oluşturma, veri işleme gibi işlemler için kullanılır.

  3. Popüler Background Jobs araçları nelerdir?

  4. Cevap:

    • Hangfire
    • Quartz.NET
    • Azure WebJobs
    • MassTransit
    • NServiceBus
  5. Background Jobs'ın avantajları nelerdir?

  6. Cevap:

    • Performans optimizasyonu
    • Güvenilirlik
    • Kullanıcı deneyimi
    • Ölçeklenebilirlik
    • Kaynak yönetimi
  7. Idempotent işlem nedir?

  8. Cevap: Idempotent işlem, aynı işlemin birden fazla kez yapılmasının sonucu değiştirmemesidir. Background Jobs'da önemli bir kavramdır.

  9. Job durumu nedir?

  10. Cevap: Job durumu, bir background job'ın yaşam döngüsündeki mevcut durumunu temsil eder (örn. Scheduled, Processing, Succeeded, Failed).

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. Background 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. Zamanlanmış 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 izleme nasıl yapılır?

  8. Cevap:

    public class JobMonitor
    {
        private readonly IMonitoringApi _monitoringApi;
    
        public JobMonitor(IMonitoringApi monitoringApi)
        {
            _monitoringApi = monitoringApi;
        }
    
        public async Task<JobStatus> GetJobStatus(string jobId)
        {
            var job = await _monitoringApi.JobDetails(jobId);
            return new JobStatus
            {
                State = job.History[0].StateName,
                CreatedAt = job.CreatedAt,
                StartedAt = job.StartedAt,
                CompletedAt = job.CompletedAt
            };
        }
    }
    

  9. Job 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);
    
            // Yeniden deneme stratejisi
            if (ex is TransientException)
            {
                _backgroundJobClient.Schedule(() => RetryJob(jobId), TimeSpan.FromMinutes(5));
            }
        }
    }
    

İleri Seviye Sorular

  1. Background Jobs performans optimizasyonu nasıl yapılır?
  2. Cevap:

    • Job parçalama
    • Batch işlemler
    • Queue yönetimi
    • Kaynak optimizasyonu
    • Ölçeklendirme stratejileri
  3. Background Jobs güvenliği nasıl sağlanır?

  4. Cevap:

    • Erişim kontrolü
    • Veri şifreleme
    • Job doğrulama
    • Audit logging
    • Güvenlik izleme
  5. Background Jobs ile distributed sistemler nasıl yönetilir?

  6. Cevap:

    • Cluster yapılandırması
    • Job dağıtımı
    • Load balancing
    • Failover stratejileri
    • Consistency yönetimi
  7. Background Jobs ile monitoring nasıl yapılır?

  8. Cevap:

    • Job durumu takibi
    • Performans metrikleri
    • Hata izleme
    • Alerting
    • Dashboard tasarımı
  9. Background Jobs ile scaling nasıl yapılır?

  10. Cevap:
    • Horizontal scaling
    • Vertical scaling
    • Auto-scaling
    • Load balancing
    • Resource allocation