Strategy Pattern ve Background Job Kullanarak Döviz Kurlarını Çekme

 

Strategy Pattern ve Background Job Kullanarak Döviz Kurlarını Çekme


Selamlar. Uzun zamandır teknik bir yazı yazmadığımı fark ettim. Bu konfor alanımdan çıkıp son geliştirdiğim ve Github'a gönderdiğim bu küçük örnek projenin detaylarını biraz açarak başlıklarla bazı teknik detaylara değinmek istedim. 

Projeyi, .Net 5 Framework ve Console App türünde geliştirdim. Projenin temelde yaptığı şey; farklı döviz kuru kaynaklarından, kurların async bir şekilde çekilmesi ve ekrana yazdırılmasını kapsıyor. Kullandığım mimarileri ve faydalandığım kaynakları başlıklar halinde açıklamaya çalışacağım. 

Github Proje Linki : https://github.com/serkanince/NetCoreBackgroundJobsSample


Strategy Pattern Nedir

Davranışsal Tasarım Kalıpları (Behavioral Design Pattern) kategorisinde yer alan Strateji Tasarım Kalıbı (Strategy Pattern) ; bir fonksiyonun (farklı bir deyişle algoritmanın) çalışma esnasında farklı bir davranış göstermesini istediğiniz durumlarda devreye girer. 

Aynı girdi alan (input) ve çıktı veren (output) bir fonksiyonun farklı algoritmalar yürütülerek bu işlemleri yapmasını istiyorsanız,  aynı arayüz (interface) üzerinden farklı stratejileri gerçekleştiren sınıflara implemente ederek ilgili fonksiyonları kullanabilirsiniz.

Kompozisyon temelli bir tasarım kalıbıdır. Bu durum onu Inheritince with Composition yaklaşımına uygun kılar.


OOP Nesne İlişkileri

Nesne Yönelimli Programlama (OOP) dünyasında,nesneler arasında bulunan ilişkilendirmeyi Assocation, Composition ve Aggregation olarak üç ana başlıkta inceleyebiliriz.


Association Nedir ?

Nesneler arasındaki gevşek bağlantı (weak has-a) ilişkisine Association diyoruz. Burada, nesneler bir bütün sınıfı ifade ediyor olsa da aralarında yer alan ilişki, birbirlerine tamamen bağlı değildir.

Bir otobüsün birden fazla yolcusu olabilir. Ama bir noktada yolculardan herhangi birini indirseniz dahi otobüsün mantıksal akışında bir hata olmayacaktır. Bir ilişki vardır fakat gevşektir. 

Composition Nedir ?

Sahip olunan nesnenin sahip olan nesneden bağımsız bir şekilde var olamamasına Composition diyoruz. Burada yer alan ilişki; iki farklı sınıfın, birbirinden bağımsız hareket edememesini ifade eder. Aralarında, sıkı bağlantı (Has-A) ilişkisi vardır. 

Örnek olarak; bir otobüsün bir şoförü olabilir. Şoförü otobüsten aldığımızda otobüs yolculuğuna devam edemez. Otobüs, şoföre Has-A ilişkisindedir.

Has-A ilişki, sınıf bir diğer sınıfa sahiptir. O bir şeye sahiptir gibi düşünebiliriz. Kuşun bir kanata sahip olması gibi. Kuşun Kanadı (Wing) sınıfı, Kuş (Bird) sınıfı içerisinde bir örneğinin tanımlanması gerektiği anlamına gelir.

Aggregation Nedir ?

Birbirinden bağımsız davranış sergileyebilen fakat birbirleri arasında sahiplik ilişkisi de bulunabilen iki sınıfın, birbirleri arasında ki ilişkisine Aggregation diyoruz. 

Örnek olarak: Şoför örneğinden gidecek olursak, şoför birden fazla otobüse şoförlük yapabilir. Yani bir otobüs ile şoförün arasında Aggregation ilişkisi vardır. Otobüsün olmaması şoförü etkilemeyecektir.

Sahip olunan nesnenin, sahip olduğu nesneden bağımsız bir şekilde hareket edebilmesidir.

Is-A Nedir ?

Kalıtım verdiğiniz bir sınıf, üst sınıfla doğrudan Is-A ilişkisindedir. Örnek olarak Kuş (Bird) sınıfı Hayvan (Animal) sınıfından eğer miras alıyorsa, Kuş (Bird) sınıfı bir Hayvandır (Is A Animal) diyebiliriz. 

Ek bilgi olarak; Arayüzler (Interface) ile kalıtım verdiğiniz bazı durumlarda bu böyle değildir. Örnek olarak Uçabilmek arayüzü (IFlyable), Kuş sınıfına implemente edildiğinde, Kuş sınıfı, Uçabilir olduğunu yani uçabilme özelliğine sahip olabildiğini gösterir. Burada bir Can-Be durumu vardır.

UML şemasında nesne ilişkileri



Background Job ve IHostedInterface Arayüzü

.Net 2.0 ile birlikte hayatımıza giren IHostedInterface, geliştirdiğimiz uygulamaların kolay bir şekilde, barındırılabilen arka plan uygulamaları (Backgound Services) olarak genişletmemize olanak veriyor.

IHostedService arayüzünü implemente ettiğiniz sınıfa StartAsync() ve StopAsync() olarak iki tane metodu kullanabilir hale geliyorsunuz. Detaylı kullanım ve örnekler için resmi dokümanı inceleyebilirsiniz.

Ben projede, ConsumerBGService ve ProducerBGService olarak iki farklı servis ayağa kaldırıyorum. Kullanım şeklini kod üzerinden inceleyebilirsiniz.


IHostedInterface


Retry Policy Kavramı (Polly)

Polly; retry,circuit breaker,timeout gibi yaklaşımlarla hata durumlarını ele aldığımız bir hata yönetim kütüphanesidir. Github'da yer alan dokümanı incelerseniz bir çok özelleştirme örneğini bulabilirsiniz.

Retry Policy ; istek attığınız adrese ulaşılamayan durumlarda bazı kurallara göre tekrar belli aralıklarda istekleri atmanızı mümkün kılan bir politikadır (policy). 

Kendi projem için; döviz kurlarını çekmeye çalışırken bir şekilde servisten veriyi alamadığı senaryolarda, Polly yardımı ile belli aralıklar ile istek atılmasını tekrar deneyen bir yapıyı en basit konfigürasyon ile ayağa kaldırdım. İlgili konfigürasyonlar Github üzerinde Program.cs dosyasından inceleyebilirsiniz.


Retry Policy



Producer and Consumer (Pub/Sub Tekniği)

Çok basit bir tanım ile; üreticinin (producer) bilgiyi, asenkron olarak tüketicilerle (consumer) paylaşılmasını mümkün kılan mimariye verilen isimdir. Genellikle bulut tabanlı dağıtık mimarili sistemlerinde bu yaklaşımları görmemiz mümkün. Bu mimarinin uygulanmasında RabbitMQ,Kafka ve Redis gibi teknolojilerden yararlanılarak geliştirilir.


Benim projede kullandığım en basit ve pratik olacak şekliyle; bilgiyi yayan ve bilgiden beslenen olmak üzere iki farklı arka plan uygulaması ayağa kaldırdım. Kullandığım senaryoda Message Broker olarak Concurrent Queue tercih ettim. Çok havalı teknolojiler kullanmadan da en basit halini gerçekleştirebilmeyi hedefledim.


Bir kuyruk mekanizması kullanmanın avantajları ;

  • Daha iyi erişebilirlik ve hata işleme
  • Daha iyi ölçeklenebilirlik
  • Verileri isteyen/ihtiyaç duyan herkesle paylaşabilme
  • Eşzamansız olması açısından iyi kullanıcı deneyimi

Concurrent Queue ve Thread Safe

Projede, döviz kurlarını çektikten sonra bu bilgiyi bir Message Broker'a atılması lazım ki dinleyiciler beslenebilsin. Message Broker olarak Concurrent Queue tercih ettiğimi belirtmiştim. Concurrent Queue, Thread Safe ve FIFO algoritması ile çalıştığı için buradaki ihtiyacımı çözüyor.

Thread Safe kavramını biraz açmak gerekirse, birden fazla iş parçacığının (threads) bir nesneye ulaştığı senaryolarda; nesne, güvenilir bir şekilde doğru koşullar altında çalışmayı garanti etmesidir. MSDN üzerinden Thread-Safe Collections başlığına göz atmanızı öneririm.


thread safe


 

Soyut kavramları yazıya dökerek anlaşılabilir hale getirmek oldukça zor. Burada yapılan cümle ve mantık hataları için geri bildirim vermeyi lütfen ihmal etmeyin.

Şimdilik bu kadar bir sonraki yazıda görüşmek üzere :)

Github Proje Linki : https://github.com/serkanince/NetCoreBackgroundJobsSample


*Yazıyı pür dikkat inceleyip düzeltmeleri bildirdiği için Zeynep'e kalp <3


Yorumlar

Bu blogdaki popüler yayınlar

Philips 246E9Q LCD Monitör Kutu Açılışı

Iyzico Error Code 11

Visual Studio'da Toplam Kod Satır Sayısını Bulma