31 Ocak 2023 Salı

Get data from microservices

Mikro servislerin faydası, Bağımsız olarak geliştirilmesi ve bağımsız olarak çalışabilmesiyle mümkündür. Mikro servisler arasındaki bağımlılıklar, micro servis mimarisini bize sunacağı faydayı azaltır.

Selective data replication, bağımlılığın scopunu en aza indirirerek  başka bir mikro servisin datasını kullanmamıza olanak tanır. Bu yaklaşımı kullanarak ihtiyacımız olan  datanın bulunduğu mikro servisin API'sine bağımlı olmak yerine data schemasına bağımlı oluruz. Yani ihtiyacımız olan datanın tablosunu bu micro servis içinde oluşturacağız.

Böylece geliştirme ve üretimde mikro servislerin bağımlılık maliyetini en aza indirmiş oluruz.

Giriş

Monolitik uygulamalarda, tüm verilerimiz tek bir ilişkisel veritabanında olduğundan dolayı datalara sorguları çok kolay bir şekilde yapabiliyoruz.

Micro servis mimarisiyle verilerimiz birden çok veritabanı üzerine dağıtılır. Her mikro servis  sadece kendi veritabanına erişebilir. Birden çok mikro servisten  gelen verileri birleştirmek için kullanıma hazır bir çözüm de yoktur.

1- Selective Data Replication

Bu yaklaşımla, diğer mikro servislerden ihtiyaç duyduğumuz verileri mikro servisimizin veritabanında replicasını oluşturuyoruz. (Yeni bir tablo açıp oraya kaydetmek)

Mikro servisler arasındaki tek bağlantı, data replication configuration olacaktır.

Publish-Subscribe Replication yaklaşımı kullanılarak veritabanı dataları güncellenir.

Advantages:
  • Implemantationu basitleştirir. Verileri sorgulamak için REST çağrılarına gerek kalmaz. Ayrıca datalar micro servisin kendi veritabanınad olduğundan verileri birleştirmek için artık SQL Join kullanılabilir
  • Test etmeyi basitleştirir. Mikro servis API'sini test ederken diğer mikro servislerin online olması gerekmez.
  • Separation of concerns. Diğer servislerle olan veri entegrasyonu, mikro servis API'sinin implementasyonundan ayrıdır.
  • Sorgu kriterleri, verileri tüketen mikro hizmet tarafından uygulanır. Artık ihtiyacınız olan sorgular için  verileri sağlayan mikro servise bağımlı değiliz. Tüketici mikro servisler kendi veritabanı sorgularını yapabilirler.(ihtiyaç duydukları kriterler ne olursa olsun). Bu, tüketen mikro servislerin gereksinimleri değiştiğinde verileri sağlayan mikro servisi değiştirme ihtiyacını ortadan kaldırır.Ayrıca, mikro servisleri tüketerek artık gerekli olmayan uzak sorgu API'lerini (tedarik eden mikro hizmetten) izlemeniz gerekmeyecek.
  • Daha düşük latency. Diğer mikro servisleri http requesti atmak yerine verileri doğrudan veritabanından alabilirsiniz.
Disadvantages:
  • Verilerin tutarlı olmaması. Replica eninde sonunda tutarlı olacaktır; Fakat her değişiklik için, verilerin mikro servisler arasında senkronize olmayacağı kısa bir süre olacaktır.
  • Deployment processe  fazladan bir step eklenecektir. Veritabanı şeması değiştiğinde, microserisimiz  configurasyonun güncellenmesi gerekebilir.(taloya yeni bir kolon eklenmesi vs.)
  • Aynı datanın farklı veritabanlarında dublicate olması. Servisler arasında ne kadar çok veri kopyalanırsa, bakım yükü ve veritabanı yedekleme(backup)  maliyetleri vb. o kadar yüksek olur.
  • Veri güvenliğini sorununu arttırır. Birden fazla veritabanında ve muhtemelen mesajlaşma sunucunmzda da saklanan verilerin kopyaları olacaktır. Bu yaklaşım hassas bilgiler (ör. kredi kartı bilgileri) için uygun olmayabilir.

2- Direct Queries Between Microservices

Her bir mikro servis, ihtiyaç duyduğu veriler için diğer mikro servislere http requesti atar.

Bu, monolitic bir uygulama geçmişine sahip geliştiriciler için içgüdüsel bir seçimdir. Developerlar, local method çağrıları yerine   remote çağrılar yaparlar(ör. REST).

Advantages:
  • Live data. Return edilen datalar microservisin current statetidir.
Disadvantages:
  • Tightly coupled. Veriyi almak istediğimiz micro servise sıkı bir şekilde bağlanmış oluruz.
  • Dependencyler online olmalıdır. Bir mikro servisin offline olması diğer servislerin çökmesine neden olabilir.
  • İhtiyacımızdan daha fazla veriyi almak. Sadece EntityNam alanına  ihtiyacımız varken tüm entityi aldığımız durumlar yaygındır. Bu serialization/deserialization israfına yol açar

3-Composite Service Layer

Composite servis, low-level microservislerden dataları aggregate eder. 

Advantages:
  • Low level microservisler birbirine coupled değildir. 
  • Live data. Return edilen datalar microservisin current statetidir.
Disadvantages:
  • Low level micro servislerde external dataya ihtiyaç duyarsa bu çözüm işe yaramaz.
  • Composite servis kendi altındaki low level micro servislere tigth-coupled olacaktır. Servisler arası bağımlılığı composite servis üzerine taşımış olduk. Bu durumda composite servis dar boğaz sorunu oluşabilir.
  • Dependencyler online olmalıdır. Bir mikro servisin offline olması diğer servislerin çökmesine neden olabilir.
  • İhtiyacımızdan daha fazla veriyi almak. Sadece EntityNam alanına  ihtiyacımız varken tüm entityi aldığımız durumlar yaygındır. Bu serialization/deserialization israfına yol açar.
  • More difficult to debug requests

4- Joining data in the user interface

Bu yaklaşımda user interface (UI)  ihtiyaç duyduğu tüm datalar için micro servis endpointlerine request atar.

5- Views between database schemas

Tamamen ayrı veritabanları yerine, her mikro servisin aynı veritabanında ayrı bir şeması vardır.

Disadvantages:
  • The database is a single point of failure

How to request information from multiple microservices?


Front-end apisi Description, Relations, ve Prices apilerine subcribe olmuştur. O apilereden gönderilen eventlere göre kendi tablolarını update etmektedir. Front-end api dataları sadece bu eventlerle update edilmelidir.

REFERENCE

30 Ocak 2023 Pazartesi

Nullable

C# Nullable value types, bir değişkenin bir değerinin olmasına yada null olmasına izin veren bir tür temsilidir.

Nullable, bir typedan sonra ? koyulurak yapılır. Örneğin, int? değerin bir integer veya null olabileceği anlamına gelir.


Nullable Value Type vs Reference Type

  • Reference Typelar  null value destekler.
  • Value Type  değişkenler, Nullable value type kullanılmadığında null valueyi desteklemez.
Örneğin, int için varsayılan değer 0'dır. Ancak 0 bazen geçerli bir değer olabilir. Bu durum bazen  hataya yol açabilir. Nullable typelarda, bir değeri yoksa değişkeni null olarak ayarlayabiliriz. Böylece değişkenin bir değerinin olmadığını ve olası hatalardan kaçınmış oluruz.






26 Ocak 2023 Perşembe

Dictionary

C# dictionary key-value çifrtini tutan bir structure(yapı)dır.

Initialization

C#'ta bir dictionary tanımlamak için  önce key türünü  ve value türünü belirlememiz gerekir.



Dictionary Operation




Duplicate values

Key uniq olmalıdır. Eğer aynı key eklenmek istenirse KeyNotFoundException fırlatılır. Bunun için containskey metodu ile kontrol edilir.


Get Value By Key

"Adam" keyine ait bir value varsa onu getir. Eğer dictiopnaryde öyle bir key yoksa geriye integerin default valusunu getir. İntegerin default valuesi 0 dır.

Case İnsensitive Dictionary 




✅ dict["hello"]
✅ dict["HELLO"]
✅ dict["Hello"]
Yukarıdaki şekilde her key aynı valueyi işaret edecektir.

Const vs Readonly

C#'ta const ve readonly keywordleri arasındaki temel fark, const'ın atama sırasında tanımlanması gerekirken, readonly alanının run-time da  tanımlanabilmesidir.

Const'lar dolaylı olarak statiktir, readonly değerlerin ise statik olması gerekmez.

Ayrıca, Assemliede çalışırken const ve readonly farklı davranışlara sahiptir. Constlar, kendisini kullanan her assemblyde kopyalanırken, readonly alanlar assemblyler arasında paylaşılır.


Assemblies


Örneğin, A assembly ve B assembly isminde iki adet assemblye sahip olduğumuzu düşünelim
A assembly constantı tanımlasın


Hem A assembly hem de B assembly aynı constantı kullanır.

Yukarıdaki constant 15 olarak değiştirirsek, her iki assemblyde de yeniden re-compile gerekir.

Öte yandan, statik readonly alanla, yalnızca A assembly yeniden re-compile yeterlidir.



En uygun kullanım 


23 Ocak 2023 Pazartesi

Enum

 



Aşağıdaki gibi yaparsak çalışmayacaktır.


Yukarıdaki gibi Enuma string değer vermek istiyorsak static readonly kullanılır.




20 Ocak 2023 Cuma

Normalizasyon Kuralları


 


1. Normal Form Kuralları

  • Her tablonun bir tane uniq Id değeri olmalıdır.
  • Bir kolonda aynı türden birden fazla bilgi bulunmamalıdır. Veriler özel karakterlerle ayrıştırılmamalıdır. Oyuncu1 kolonuna bakarsak 2.  satırlarda birden fazla oyuncu virgül ile ayrılmıştır.
  • Her kolon sadece kendi bilgisinden sorumlu olmalıdır. Oyuncu1 kolonunda 3. satırda oyuncu ismi ve doğum tarihi birlikte kullanılmıştır.



2. Normal Form Kuralları
  • 1. Normal form uygulaması
  • Yatay tekrar söz konusu olamaz. Oyuncu1 ve Oyuncu2 kolonları yatayda tekrar etmektedir. 3. bir oyuncu eklenirse yeni bir kolon daha açmak gibi sonsuz döngüye girilebilir.
  • Tekrar eden kolonlar ayrı bir tabloya taşınmalıdır. Yönetmen, Kategory (1e n)

3. Normal Form Kuralları
  • ikinci normal form uygulanmalıdır.
  • Çoka çok ilişkinin uygulanması gerekir.(n e n) Bir filmde birden çok oyuncu oynayabilirken bir oyuncuda birden çok filmde oynayabilir. Oyuncular ve FilmOyuncuları isminde birer yeni tablo oluşturulur.


19 Ocak 2023 Perşembe

String.Equal

İki stringi karşılaştırmak için ToLower() ve ToUpper() kullanmak yerine Equal kullanmalıyız.  ToLower() ve ToUpper() memoryde yeni bir string olusturur. Equal ise memoryde yeni string oluşturmaz. Bu yüzden daha performanslıdır. 




Boxing - UnBoxing

✅Value Type  bir değişkeni objecte türü değişkene dönüştürüldüğümüzde  boxing


✅Bir object  değişkeni bir value type  dönüştürüldüğümüz de unboxing


18 Ocak 2023 Çarşamba

HttpClientFactory

 Asp.Net Core 2.0 sürümünde HttpClient yük altında çalışan uygulamalarda socket connection mangement tarafında  sorununa sebep oluyordu. 

.Net core 2.0 uygulaması üzerinde HttpClient sınıfını kullanarak bir loop içerisinde htpp call yapıp netstat çektiğinizde açılan socket'lerde TimeWait'ler oluşturduğunu bununda uygulamalarda ciddi sorunlara sebebiyet verdiği gözlemlendi.Bu sorunu çözmek için .Net2.1 release'den sonra hayatımıza HttpClientFactory sınıfı girdi.

HttpClientFactory, doğru memory management'ı yaparak http istekleri yapmamızı sağlan HttpClient(.net 4.5 ile geldi) sınıfının instance'ını oluşturmak için kullanılan sınıftır. HttpClient sınıfının çok fazla instance'ını oluşturmak uygulamalar için maliyetli bir işlemdir. Her yeni bir instance remote server için yeni bir connection demektir. Çok fazla trafiğin olduğu bir uygulamada ise gerektiğinden fazla httpClient instance'ı oluşturmak uygulama için kullanılabilecek socket'lerin tüketilmesi demektir ki bunu istemeyiz.

Bu sınıf HttpClient instance'larının doğru yönetilmesini sağlar ve böylelikle yukarıda bahsettiğimiz sorunları çözdüğünden oldukça önemli bir feature dır.





15 Ocak 2023 Pazar

Materialisation / Conversion ( ToLookup, ToDictionary, ToList / ToArray )

 ToLookup




ToDictionary, önemli bir farkla ToLookup'a benzer şekilde çalışır. ToDictionary metodu yalnızca 1'e 1 ilişkilere izin verir. İki öğe aynı keyi paylaşırsa, keyin zaten mevcut olduğu bir exception fırlatırlır. Ayrıca dictionary daha sonra mutasyona uğratılabilir (örneğin, Add metoduyla).


ToList/ ToArray

IEnumerable lazy evaluted olduğu için ToList ve ToArray Materialisation / Conversion  için kullanılır. Aşağıdaki örneğe baktığımızda list üzerinde ToList() metodunu çağırdıktan sonra artık evenNumber listesi oluşturulmuştur olacaktır. Arık list içersine yeni değerler eklesekte bu değerler evenNumber değerini etkilemeyecektir. Çünkü List üzerinde ToList metoduyla bu değer hesaplandı artık değişmez.



14 Ocak 2023 Cumartesi

Element ( First, Single, FirstOrDefault, SingleOrDefault )

Bu bölüm, enumerationdan belirli bir öğenin nasıl alınacağını inceler.


First, bir öğenin ilk geçtiği yeri döndürür. Daha sonra öğeler olsa bile, her zaman ilk bulunan öğeden hemen sonra geri döner. Hiçbir öğe bulunamazsa, bir exception fırlatır.




Single, aranan öğeyi bulur bulmaz dönmez. Firstten farklı olarak ikinci bir öğenin olmamasını da kontrol eder. Eğer bir öğeden birden fazla bulursa exception fırlatır. Bir öğeden hiç bulamazsa yine exception fırlatır.





FirsrOrDefault, Aranan öğeden bir tane bulursa ilk bulduğunu return eder.  Eğer bulamazsa default değerleri geriye döner(for reference types null and for value types the given default like 0 for an integer)

SingleOrDefaultAranan değerden sadece bir tane varsa geriye onu döner. Eğer hiç bulamazsa default değerleri geriye döner(for reference types null and for value types the given default like 0 for an integer). Fakat aranan değerden birden fazla var ise exception fırlatır.






Merging( Join )

 






Linq Extention Stackoverflow






Quantification( Any, All, SequenceEquals)

ANY En az bir tane öğenin koşulunuzu karşılayıp karşılamadığını kontrol eder ve koşulu karşılayan en az bir kayıt varsa geriye true döner.




ALL adından da anlaşılacağı gibi listedeki tüm verilerin koşulu sağlamazsı gerekir. Hepsi koşulu sağlarsa true en az bir tanesi sağlamazsa geriye false döner.






SequenceEquals, iki dizinin eşit olup olmadığını kontrol eder. Eşit içinde aynı miktarda girdiye sahip oldukları anlamına gelir. Numaralandırma ve tüm öğeler eşittir





Aggregation ( Count, Aggregate, Max(By), Min(By) )

Count  




Aggeragate 
"Reduce" olarak da bilinir. Ana fikir, bir dizi inputu tek bir değerde aggregate/reduce etmektir. Her zaman bir başlangıç deperi vardır. Listedeki tüm değer sırayla bu başlangıç değerine eklenerek ilerlenir.