.Net Core – Worker Servis Nedir?

.Net Core Worker aracılığıyla, uygulamalarının çalışmaya başladığı andan çalışmayı durdurma anına kadar ki geçen süreçte arka planda çalışan servislerin kontrolünü sağlayan yapıdır. Örneğin belirli zaman aralıklarında Cache temizleme işlemleri, belirli zaman aralıklarında sistem durumunu inceleyip raporlayan servisler gibi örnekler verilebilir. Workerlar herhangi bir görünümden (View) bağımsız olarak çalışır. Yani projelerimizde genellikle bir sayfaya girildiğinde ilgili sayfaya ait servisin çalıştırılması sağlanır ama Workerlar projenin sunucuya yüklenip yayına alınmasıyla birlikte çalışır ve proje ömrünü tamamlayana kadar arka planda yaşam döngüsünü sürdürür.

Worker .Net Core 3.0 ile . Net’e eklendi. ve .Net Core 2.1 de IHostedService olarak kullanımı mevcut ama 3.0 ile gelen Worker, IHostedService yapısını daha derli toplu bir hale getirerek kullanımı kolaylaştırmış oldu.

.Net Core Worker ile Syslog Loglarını Mongodb’ye Ekleme

Worker’ın çalışma mantığını daha iyi anlamak için bir örnek üzerinden gitmek istiyorum. Örneğin bir SIEM ürünü geliştirdik ve Syslog loglarını arkaplanda dinleyip veritabanına eklemek istiyoruz. Bu işlemler gerçekleşirken SIEM ürününün çalışmasını engellememesi için bu servisin eşzamansız olarak çalışması gerekiyor. Biz bir korelasyon yazarken arka tarafta gelen logları parse edip kaydeden bir servisin çalışıyor olması gerekiyor. İşte arkaplanda çalışacak olan bu servisi worker ile tasarlıyor olacağız.

  1.     Visual Studio ile yeni bir Worker Service (Çalışan Hizmet) Ekliyoruz.
.Net Core Worker Ekleme
.Net Core Worker Ekleme
  1.  Oluşan .Net Core Worker Projemize BackgroundService sınıfından türeteceğimiz yeni bir Worker sınıfı ekliyoruz. Visual Studio genelde bu sınıfı otomatik olarak ekliyor. 
.Net Core Worker Sınıfı
.Net Core Worker Sınıfı
  1. Yukarıdaki kodda Worker sınıfı BackgroundService sınıfından türetilerek otomatik olarak çalışma özelliğine sahip oldu. BackgroundService sınıfı StartAsync(), ExecuteAsync(), StopAsync() ve Dispose() olmak üzere 4 adet methoda sahiptir. ExecuteAsync() uygulamamız ayağı kalktığında çalışacağı business logic barındıran methoddur. Dispose() methodunda ise oluşturulan sınıf, nesne instance(örnek)’ları ve GAC boşaltılır.

ExecuteAsync : Bu metod program çalıştırıldığında Worker sınıfında çalıştırılacak ilk metoddur. BackgroundService sınıfına aittir ve biz bu metodu Worker sınıfımızda override ederek eziyoruz.

DoWork : Bu metod bizim iş yaptıracağımız metoddur. İçerisinde SyslogListener sınıfından bir instance oluşturuyoruz. SyslogListener sınıfını aşağıda anlattım şimdilik sadece SyslogListener sınıfının ListenToSyslog metoduna stoppingToken değerini gönderdiğimizi bilelim.

StopAsync : Bu metod program durdurulduğunda çalıştırılır.

stoppingToken : CancellationToken tipinde oluşturulan stoppingToken programın durumunu bildirir. Program eğer çalışıyorsa false durdurulduysa true değeri döndürür. İlerleyen kısımlarda nasıl kullanıldığını daha net anlayacaksınız

Worker sınıfımızı özet geçecek olursam BackgroundService sınıfından türeterek arkaplan servisi olarak çalışmasını sağlamış olduk. Aslında Worker sınıfı içerisinde ExecuteAsync metodu altında da Syslog loglarını dinleyebilir ve Mongodb üzerine yazabilirdik ama bu şekilde bir kullanım projemize farklı arkaplan servisleri eklemek istediğimizde kodlarımızın düzensiz ve karmaşık görünmesine neden olacaktı. Bu nedenle syslog loglarını dinlemek için SyslogListener adında yeni bir sınıf oluşturdum.

ListentoSyslog
ListentoSyslog

SyslogListener sınıfının ListenToSyslog metodunda 514 portunu dinliyoruz ve 514 portuna gelen logları regex ile parse edip veritabanına eklenmesi için logService.Create metoduna aktarıyoruz. Farkettiyseniz Worker class’ından gelen stoppingToken while döngüsünde kontrol ediliyor. stoppingToken’ı yapmak istediğimiz işin devamlılığını sürdürmek için kullanıyoruz. While döngüsü stoppingToken True olana kadar döngüye devam edecek ve gelen logları tek tek alıp parse edip ardından veritanına eklenmesi için LogService sınıfına aktaracak.

Yukarıdaki kodda regex deyimi uzun olduğu için aşağıya aynısını ekşiyorum.

<134>\s+\s+id=(?<id>\S+)\s+sn=(?<sn>\S+)\s+time=(?<date>\d+-\d+-\d+\s+\d+:\d+:\d+)\s+fw=(?<fw>\d+.\d+.\d+.\d+)\s+pri=(?<pri>\d+)\s+c=(?<c>\d+)\s+m=(?<m>\d+)\s+msg=(?<msg>.*)\s+app=(?<app>\d+)\s+n=(?<n>\d+)\s+src=(?<src>\d+.\d+.\d+.\d+:\d+:\S+)\s+dst=

logService ve log nesnelerini Dispose etmemin nedeni anlık gelen log sayısının fazla olması oluşturulan nesnelerin sayısını da arttıracaktır. Bu nedenle kullanılan nesnelerin bir sonraki döngüye kadar bellekten atılması sağlanır.

Şimdi gelelim logların Mongodb’ye eklenmesine.

Bunun için aşağıdaki gibi bir tane Log nesnesi oluşturdum. Log nesnesini oluştururken bana gelecek olan logun yapısını daha önceden inceledim ve log’da bulunan değerlere uygun bir Log nesnesi oluşturdum. Bu log nesnesi Syslogdan gelen logları parse ettikten sonra benim için önemli olan değerleri aktardığım nesne olacak. Ayrıca veritabanına eklerken de belirli bir şablonda eklenmesini sağlayacak.

Veritabanına ekleme işlemini ise LogService sınıfı yapıyor. Daha doğrusu Loglarla ilgili veritabanı Crud işlemlerini bu sınıfta tanımladık.

Log Service
Log Service

4.   Son olarak .Net Core Worker’ın program başlatıldığı anda otomatik olarak çalışmasını sağlamak için Program.cs aşağıdaki gibi yapılandırılır. 

CreateHostBuilder Yapılandırması

İlginizi Çekebilecek Makaleler​

LLM (Large Language Models) Nedir?

Günümüzde yapay zeka ve makine öğrenmesi, teknolojinin birçok alanında devrim niteliğinde ilerlemeler kaydetmiştir. Bu ilerlemelerin merkezinde yer alan büyük dil modelleri (LLM – Large Language

Devamı »
Message Broker Nedir?

Message broker, birçok farklı uygulama veya sistem arasında iletişim kurmak için kullanılan bir yazılım aracıdır. Bu araç, bir uygulama tarafından gönderilen mesajları bir veya daha

Devamı »
Loglama Nedir?

Loglama, bilgisayar sistemlerindeki olayları, hataları ve diğer önemli durumları kaydetme işlemidir. Bu kayıtlar, sistem yöneticileri ve geliştiriciler tarafından, sistemlerin işleyişini anlamak, hataları tespit etmek ve

Devamı »
Vcenter Üzerinden ESXI Upgrade’i Nasıl Yapılır?

Öncelikle herkese merhaba arkadaşlar, sizlere Vcenter üzerinde ESXI hostunuzu nasıl upgrade edeceğinizi anlatacağım. Öncelikle hangi versiyona yükselteceksek o versiyonun ISO dosyasını indiriyoruz. Ardından Vcenter’ımızı açıyoruz.

Devamı »