Hangfire
1. Hangfire Nedir?
Hangfire, background job’ları (arka plan işleri) yaratmanıza, yürütmenize ve yönetmenize kolaylık sağlayan açık kaynaklı kütüphanedir. Bazı kodların arka planda çalışması gerekmektedir. Çünkü bir iş parçacığının ana thread’de çalışması hem doğası gereği hem de bazı ihtiyaçlar dahilinde uygun olmayabiliyor.
Basit bir örnek vermek gerekirse, belli bir işlemin sonunda binlerce kullanıcıya mail atmanız gerekiyor, eğer bu işlemi hangfire veya benzeri toollar kullanmadan ana threadte yapmaya kalkarsanız, mail işleminin hemen arkasından gelecek işlem doğal olarak mail işleminin sonlanmasını beklemek zorunda ve bu fazlaca zaman alabilir. Ancak mail gönderme işlemini başka bir thread üzerinde backgroundjob oluşturup çalıştırırsanız, mail gönderme işleminden sonra gelen işlem mail gönderme işleminin sonlanmasını beklemek zorunda kalmayacaktır.
2. Hangfire’ın Desteklediği Background Job Tipleri
- Fire and forget : Bir kere ve hemen çalışan background job tipi
var jobId = BackgroundJob.Enqueue( () => Console.WriteLine("Fire-and-forget!"));
- Delayed : Bir kere fakat belirtilen sürenin sonunda çalışan background job tipi
var jobId = BackgroundJob.Schedule( () => Console.WriteLine("Delayed!"), TimeSpan.FromDays(7));
- Recurring : Çok kez ve belirtilmiş CRON sürecinde (günlük, saatlik, haftalık veya CRON expressions vb.) çalışan background job tipi
RecurringJob.AddOrUpdate( () => Console.WriteLine("Recurring!"), Cron.Daily);
- Continuations : Tanımlanan ana işin bitiminde çalışan background job tipi
BackgroundJob.ContinueWith( jobId, () => Console.WriteLine("Continuation!"));
- Batch (PRO) : Birden fazla işin grup halinde çalışan background job tipi
var batchId = BatchJob.StartNew(x => { x.Enqueue(() => Console.WriteLine("Job 1")); x.Enqueue(() => Console.WriteLine("Job 2")); });
- Batch Continuations (PRO) : Grup halinde çalışan ana background job’ın bitimiyle çalışan background job tipi
BatchJob.ContinueWith(batchId, x => { x.Enqueue(() => Console.WriteLine("Last Job"));});
3. HangFire Mimari Yapısı
Hangfire kullanıcı tarafından yaratılan jobları alıp, server tarafında işleyerek kullanıcıya gerekli dönüşü yapar. Server tarafında ise her seferinde bir job alınarak işlenir ve bitimiyle sıradaki job alınır.
4. HangFire Dashboard Yapısı
- Servers (sunucular) : Kullanılan Hangfire sunucularını ve bu sunucuların bilgilerini (isim, worker sayısı, queues, başladığı an ve en son çalıştığı an vs.) gösterir
- Recurring Jobs : Yaratılan recurring job bilgilerini gösterir. Bunlar : Cron, Time Zone, Job, ne zaman çalışacağı, en son ne zaman çalıştığı ve yaratıldığı tarih. Ayrıca, her ne kadar belirli bir tarih tanımlanmış olsa da Trigger özelliği ile istenilen an tetiklenebilir.
- Retries (tekrar) : Yaratılan job’ların hata alması durumunda job’ların gösterildiği ekrandır. Kaç kere denendiği de görülebilir. Default olarak atanmış deneme (retry) sayısı 10’dur.
- Jobs (işler)
- Enqueued : Sırada olan işler,
- Scheduled : İleri tarihe ayarlanmış işler,
- Processing : Çalışan işler,
- Succeeded : Başarılı şekilde tamamlanmış işler,
- Failed : Başarısız olmuş işler (tanınmış atama sayısından sonra bile hata alınıyorsa iş buraya düşer),
- Deleted : Silinmiş işler,
- Awaiting : Sırasını bekleyen (continuations) işler.
5. HangFire Exception ve Retry
Hangfire, uygulamanızda alacağınız hataları (default tekrar deneme sayısı : 10) hata detayı ile birlikte gösterir. Hata aldığınız job, retries sekmesine düşer. Retry sayısını Global ve Method seviyesinde değiştirmek mümkün. Örneğin retry sayısını 1 yaparsanız 1. denemeden sonra tekrar hata alınması durumunda job Failed sekmesine düşecektir.
Global seviyede retry sayısını değiştirmek için aşağıdaki kodu kullanabilirsiniz.
GlobalJobFilters.Filters.Add(new AutomaticRetryAttribute() { Attempts = 1});
Method seviyesinde değiştirmek isterseniz, methodunuza aşağıdaki attribute’u ekleyebilirsiniz.
[AutomaticRetry(Attempts = 1)]
[AutomaticRetry(Attempts = 1)]
public void BackgroundMethod()
{
}
6. HangFire Kurulumu
Hangfire kurulumu son derece basit bir işlemdir
- İlk olarak nuget package managerden hangfire paketini indirmeliyiz.
- Daha sonra projemize hangfire kodlarını yazmak için Startup.cs’i eklemeliyiz.
.
- Karşımıza çıkan dosya tiplerinden OWIN Startup class‘ı seçerek işleme devam ediyoruz. Class adının Startup.cs olduğuna dikkat ediniz.
- Startup.cs dosyamızı oluşturduğumuz zaman karşımıza aşağıdaki gibi bir kod yapısı gelecektir.
- Startup.cs dosyamıza aşağıdaki kodları yazdığımız zaman hangfire kurulum işlemi tamamlanmış olacaktır.
7. HangFire Logging
Hangfire otomatik loglama desteğine (Serilog, NLog, Log4Net, EntLib Logging, Loupe ve Elmah) sahiptir. Otomatik loglama; startup sınıfında log provider tanımlamanızın yettiği anlamına geliyor. Ayrıca custom loglama desteği (ILogProvider, ILog) de mevcuttur.
8. HangFire Server Oluşturma
Merhabalar, dahil olduğum şirkette bir projede hangfire yapısı kullanılıyor. Yeni bir görev eklerken diğer kişiler ile eşzamanlı aynı dosyalara sahip olmadığımız için onların bilgisayarlarından hangfire failed fırlatmıştı. Failed olarak parlamasın diye silmiştik. Ertesi gün silinenlerin de tekrardan kuyruğa sokulup düzeltilebildiğini öğrendim ancak silinmişler sayfasında (2) yazmasına rağmen silinenler görünmüyor. Nasıl onları tekrardan görüp kuyruğa dâhil edebilirim? silinmiş olarak durması pek hoş durmuyor da. Şu şekilde görünüyor: http://i.hizliresim.com/nb0vLR.png