Hangfire Ve .Net/.Net Core Console App ile Currency Reporter

Uygulamaların response time değeri her sistem için kritik bir ölçüttür. Arka planda çalışacak ve kullanıcının beklemeye ihtiyaç duymadığı işlemler için response time’ı uzatmak uygulama performansını kötü yönde etkileyecektir.

Bu yazıda çağrıların arka planda işlenmesine, zamanlayıcı ile istenilen zamanda tetiklenmesine olanak sağlayan Hangfire kütüphanesini inceleyeceğiz.

Hangfire Nedir ?

.Net ve .Net Core uygulamalarında arka planda işlemler gerçekleştirmemizi sağlayan open source bir kütüphanedir. İçerisinde gelen dashboard ile tüm işlemlerin durumunu, tetiklenecek jobları, tetiklenme sayılarını, çalışma zamanı ve sonuçlarını anlaşılır bir biçimde takip etmemize olanak sağlar.

Yukarıdaki resimde görüldüğü gibi oluşturulan joblar tetiklenmek üzere depolanır ve zamanı geldiğinde arka planda çalıştırılır. Depolama işlemini Sql Server, Mongo DB, Memory Storage vb. seçeneklerden birini seçerek tamamlayabilirsiniz. Eğer loglara sürekli erişmek istiyorsanız veritabanı bağlantısını yapıp devam etmenizi öneririm.

Ücretsiz olan Job Türleri

1- Fire-and-forget jobs

Oluşturulduktan sonra bir kez çalıştırılan job türüdür.

2- Delayed jobs

Belirli bir zaman aralığından sonra bir kez çalıştırılan job türüdür.

3- Recurring jobs

CRON programlamasına göre birden fazla çalıştırılan job türüdür.

Daily, Minutely, Weekly vb.

4- Continuations

Ana job çalıştıktan sonra tetiklenen job türüdür.

Currency Reporter Servisi

Recurring jobs ile TR için günlük kur bilgilerini çekip e-mail yollayan .Net/.Net Core uygulaması yazarak bilgilerimizi pekiştirelim. Sistemde depolama için Memory Storage kullanarak örneğimizi gerçekleştireceğiz.

Kur bilgisini çekmek için CollectAPI üzerindeki ilgili endpointi kullanacağız.

Gerekli Kütüphaneler:

Hangfire, Hangfire.MemoryStorage, Microsoft.Owin

Proje Yapısı:

1- MailTemplate/ReportTemplate.html

Mail İçeriği için bir html sayfa oluşturalım.

2- Model/CurrencyModel.cs

Collect api üzerinden kur bilgisi çekerken kullanacağımız modeli oluşturalım.

3- Service/Concrete/CurrencyReporterService.cs

Zamanlı arka plan job’ı oluştururken kullanacağımız, kur listesini çeken ve mail gönderen fonksiyonları çağıran servisi oluşturalım.

4- Service/Concrete/CurrencyService.cs

Kur listesini çekmek için api call yapan servisi oluşturalım.

Collect API sitesine üye olarak; kullanabileceğiniz tüm endpointlere subscribe olabilir, apikey’i alabilirsiniz. Aşağıdaki apikey değeri yerine kendi aldığınız apikey’i yazıp devam edebilirsiniz. API’ ye authorize olmanız için gerekli bir işlem olduğunu belirtmek isterim.

5- Service/Concrete/EmailService.cs

Çekilen kur bilgilerini formatlı bir html body’e çevirip ilgili kullanıcılara e-mail göndermemizi sağlayan servisi oluşturalım.

Burada dikkat edilmesi gereken konu fromAddress, eğer aşağıdaki özellik açık değil ise mail göndermeyecek, hata verecektir.

E-mail göndermek için “Daha az güvenli uygulamalara izin ver: AÇIK” şeklinde ayarlanmalı. URL : https://www.google.com/settings/u/1/security/lesssecureapps

6- Service/Concrete/HtmlBodyCreator.cs

Gönderilecek mail içeriğini oluşturmak için bir class oluşturalım.

ReportTemplate.html sayfası ile dinamik gelen kur bilgilerini de birleştirerek body oluşturalım.

7- Startup.cs

Hangfire’ı initialize edip, server, dashboard, memory storage özelliklerini başlatacak şekilde düzenlemelerimizi yapalım.

Yulardaki komutu incelersek;

Günlük olarak(Cron.Daily) CurrencyReporterService içerisindeki CurrencyReporter metodunun arka planda tetiklenerek çalıştırılacağını söyleyebiliriz.

8- Program.cs

Startup dosyasını çalıştırmak için aşağıdaki şekilde güncelleyelim.

Hangfire Dashboard

Job çalıştırılmadan önce Recurring jobs sekmesinde hangi job’ların olduğu, ne zaman çalıştırılacağı vb gibi bilgileri takip edebiliyoruz.

Çalıştırıldıktan sonra ise aşağıdaki şekilde execution time takibi yapabiliyoruz.

Daha ayrıntıya girmek istersek detail sayfasında success/error bilgilerine ulaşabiliyoruz. Aşağıdaki örnek hata detayını inceleyebilirsiniz.

Eğer job başarısız sonuçlanmış ise Retries sekmesinde ilgili job’ı görebiliyoruz ve tekrar tetiklenmeye çalışılıyor olması anlık sistem hataları/kesintileri için büyük avantaj sağlıyor.

Örnekteki uygulamaya GitHub hesabım üzerinden erişebilir, daha fazla ayrıntı için aşağıdaki kaynakları inceleyebilirsiniz.

Kaynakça

Software Engineer @hepsiburada

Software Engineer @hepsiburada