Developer Summit 2020 Data Tutarlılığını Microservisler ile Sağlama

Selamlar,

21 Kasım 2020 Cumartesi günü online “DEVELOPER SUMMIT” etkinliğini gerçekleştirdik. Amaç, farklı lokasyonlarda bulunan dağıtık cacheler’de, data tutarlılığını sağlamakdı. Kısaca 2 farklı şehirde, birbirinden bağımsız Redis cachelerin tek bir DB üzerinde çalışması durumunda, birinin güncellemesi anında diğerinin buna nasıl eşitleneceğini hep beraber tartıştık.

Öncelikle NodeJS ile bir haber portalının CRUD servislerini yazdık. Projede kullanılan teknolojiler DB için mongoDB, Backend için NodeJS ve Express kütüphaneleri, Front-End için Angular Framework, Data paketlerinin işlenmesi için sıraya alındığı queue RabbitMQ, Real-Time socket için SocketIO  ve son olarak performansı arttırmak için Distributed Cache Redis kullanılmıştır.

Angular UI’da güncellenen bir haberi, Backend NodeJS tarafında mongoDB’de güncelledik. Daha sonra Redis cachelerin güncelleme işini, asenkron olarak var olan sistemden bağımsız ilerletebilmek adına RabbitMQ’nun “newsChannel”‘ına pushladık. Bir başka NodeJS ile yazdığımız MicroService consumer, ilgili “newsChannel”‘ı dinleyip kendisine gelen News datasını, tanımlanan Redis sonuçlarında tek tek güncelledi ve aynı zamanda SocketIO ile kendisine bağlı clientların “updatedNews” function’ını tetikleyerek, client browserlarının yenilenmeden güncel haber bilgisinin gösterilmesi sağladı.

NodeJS 

Get/ID: Aşağıda örnek amaçlı seçilen bir haberin detayını gösteren servis tanımlanmıştır. En başta ilgili haber Redis’de var mı diye bakıldı, yok ise mongoDB’den çekilip Redis’e 5 dakkalık expire süresi ile atıldı. Eğer Redis’e hiç erişilemiyor ise, doğrudan mongoDB’den kayıt çekildi.

Önemli Konu: Redis sistemden çıkarılır ise de, projenin kesintiye uğramadan çalışması gerekmektedir.

service.js/app.get(“/news/:newsId”)

Post/updateNews: Güncellenecek haber, aşağıda tanımlı NodeJS servise gelir. İlgili data, mongoDB güncellendikten sonra rabbitMQ’da “newsChannel“‘ına atılır. Dikkat edilir ise, bu aşamada Redis’de güncelleme işlemi yapılmamaktadır. Güncellenen data RabbitMQ’ya atılarak, Microservis tarafından clientların browser’ının, real-time olarak güncel haber datası ile yenilenmesi ve tanımlı tüm Redis sunucularına haberin son halinin atılması sağlanmaktadır.

service.js/app.post(“/updateNews”)

AngularUI

app.component.html: Ekrana basılan, yukarıda görülen güncel haber detay sayfasıdır.

newService.ts: UI tarafında, ilgili haber detaya gidildiğinde “getNewsById()” ile ilgili haber detayı, servisden çekilir. Ayrıca “updatedNews” SocketIO tarafından tetiklenerek, güncellenen haber datası Real Time olarak clientların Browserın’da güncellenir.

SocketIO:

Yukarıdaki resimde görüldüğü gibi, Microservice’de Single Responsible prensibini bozmuştur. Hem clientların browser’ını SocketIO ile Real-Time yenilemekte, hem de kendisine tanımlı tüm Redis sunucularında, alınan son haber datasını güncellemektedir. Ama maalesef bazen gerçek hayatta, benzer işleri yapan yapıların, yönetim, test ve deployment işlerini kolaylaştırmak adına aynı yerde çalıştırılması gerekebilmektedir.

Covid19 nedeni ile online yapılan bu seminerde, performans için üretilen bir çözümün, müşteri bazlı özel bir istek ile nasıl yetersiz kaldığını ve çok daha büyük sorunlara yol açtığını gördük. Daha sonra oluşturduğumuz yeni bir çözüm ile mutlu sona ulaştık. “Ekstrem sorunlar, ekstrem çözümler gerektirir”. Normalde ilgili Redis Cache, ortak bir sunucudan kullanılabilse idi, o zaman bu kadar complex yapılara hiç ihtiyaç kalınılmıyacaktı. Kısacası gerçek hayatta esas zorluk, bazen insanların aldıkları kararlardan dolayı karşımıza çıkabilmektedir. Hastalık nedeni ile zorunlu yapılan bu online etkinliğin tek faydası, yer kısıtlaması olmadan, uzak lokasyonlardan 1500 kişinin aynı anda bir sunumu katılabilmesiydi. Bu güzel etkinliğin geçekleşmesini sağlayan tüm Devnot Ekibine, Kommunity’ye, Uğur Umutluoğlu’na ve Emir Karşıyakalı’ya teşekkürü bir borç bilirim.

Yeni bir seminerde görüşmek üzere hepinize hoşçakalın.

Seminerin Sunumu: Data Consistency in Microservices Architecture-Devnot 2020

Kaynak Kodlar: https://github.com/borakasmer/DevNot2020

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

3 Cevaplar

  1. Tagi dedi ki:

    Çok başarılı olmuş.

    Teşekkürler..

  2. Erkan Güzeler dedi ki:

    Çok keyifli bir dev not sunumuydu.

    Teşekkürler.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir