Herkese merhaba Node.js ile geliştirme hayatıma devam ettiğim şu günlerde herhangi bir konu hakkında makale yazma işini gerçekten sevmeye başladığımı söyleyebilirim. Kendi adıma bir şeyleri araştırma ve öğrenme konusunda beni oldukça motive ediyor. Bu yazımda ise son zamanlarda üstüne kafa yorduğum ve bu konuyu daha iyi öğrenip araştırmalıyım dediğim bir başlık altında yazacağım evet dostlar bu sefer ki yazımızın başlığı Microservice mimariler şimdiden uzun bir yazı olacağını söylemek isterim keyifli okumalar dilerim..
Bu yazının hemen başında Microservice nedir? Monolithic nedir? ve iki kavram arasında ki farklar nelerdir, avantajları, dezavantajları gibi başlıklara biraz yer vermek istiyorum. Konuyu hiç bilmeyen birine anlatır gibi anlatmaya çalışacağım. Elimden geldiği kadar bu konuyla ilgili bütün kavramları da açıklamaya çalışacağım. Dediğim gibi uzun bir yazı olacak değerli olduğunu düşündüğüm kaynakları ise paylaşıyor olacağım. Arkanıza yaslanın ve makalenin keyfini çıkarın..
Monolithic Mimari
Monolithic mimariler tüm uygulama işlevselliğinin tek bir ünite içinde barındırıldığı bir yapıdır. Bu ne demek diyecek olursanız uygulamamız da ki kullanıcı ara yüzü, backend katmanı veya veri tabanımız tek bir katman ile birbirine bağlıdır. Bütün bu bileşenlerimiz birlikte çalıştıklarında bütün uygulamanın işlevselliğini sağlarlar. Yani daha açıklayıcı bir örnek vermemiz gerekirse şuana kadar hiç microservice mimarisiyle bir uygulama geliştirmemiş ve bu kavramı ilk defa duyan biriyseniz şuana kadar geliştirdiğiniz bütün uygulamalar Monolithic yazılım tasarım mimarisinde bir uygulamadır. Evet ilk duyduğumda bende buna oldukça şaşırmıştım farkında olmadan bir sürü monolithic uygulama yaptık belki de :) İşin biraz daha detayına girersek; Genel olarak, monolithic uygulamalar tek bir kod tabanından veya bir yazılım dilinden oluşurlar ve genelde tek bir veri tabanını kullanırlar. İsterseniz bu kısımda diğer kavramları ufak başlıklar altında toplayalım ki konuyu daha net açıklayabilelim.
Monolithic Mimari üretilecek yazılımın bileşenlerini (component) birbirlerine bağlı(interdependent) olarak ve kendi kendine yetecek(self-contained) şekilde tasarlanmasını sağlayan yazılım mimarisidir.
Tek Kod Tabanı : Monolithic mimari tek bir kod tabanına sahip olmanın avantajlarını içinde barındırır. Geliştiricilerin tüm sistemi anlamasını ve üzerinde çalışılmasını kolaylaştırır. Fakat bu durum bir çok eksi yönü de beraberinde getirmektedir yazının ilerleyen kısımlarında değinmeye çalışacağım.
Dağıtım : Deployment süreçleri Monolitik bir uygulamanın tek bir parça olmasından ötürü daha kolaydır. Karışık bir çok servise sahip bir microservice yapısını deploy etmektense tek bir monolith uygulamayı yayına almak biz geliştiriciler açısından daha az karmaşık bir iş süreci olabilir. Bu durumun Monolitik bir uygulamanın daha hızlı ve basit bir şekilde dağıtılabilmesini sağlar.
Geliştirmesi ve Test Etmesi Basittir: Tek bir uygulama içinde çalışan kod bir dizi hizmet veya modül arasında koordinasyon gerektiren daha karmaşık bir yapıdan daha kolay bir şekilde test edilebilir ve geliştirilebilir. Aynı zamanda hata yönetimi yapmak daha kolaydır.
Performans: Tek bir uygulama içinde tüm işlevlerin yer alması genellikle daha yüksek performans elde etmeyi sağlar. Ağ gecikmesi gibi problemler olmadığından uygulama daha iyi performansa sahip olabilir.
Veri Tutarsızlığı Azdır: Microservice mimarilerde bütün servisler birbirleri ile konuşma ihtiyacı duyarken Monolitik bir uygulama böyle bir durum söz konusu olmadığı için veriler tek bir veri tabanı tarafından yönetilir buda veri tutarsızlığı ihtimalini azaltır.
Evet şuana kadar Monolitih uygulamaların avantajlarından bahsettik fakat işin başka bir yönünde baktığımızda Monolith mimari seçimi bir çok dezavantajı da beraberinde getirmektedir. Dilerseniz Microservicelerin tanımına geçmeden önce bu dezavantajlardan da bahsedelim.
Dezavantajlar
Ölçeklendirme Zorlukları: Monolith bir uygulama genellikle tüm uygulamanın ölçeklendirmesini gerektirdiği için bu konuda sorunlar yaratabilir. Özellikle belirli bir özelliğin yada bir servisin daha yoğun kullanımında bütün uygulamanın ölçeklendirilmesi gerekliliğini beraberinde getirir. Bu durum verimli olmayan ve yüksek maliyet gerektiren kaynak kullanımı durumlarına yol açabilir.
Geliştirme ve Bakım Zorluğu: Monolith uygulamalar büyüdükçe ve code base üzerinde karmaşıklık artmaya başladıkça projenin anlaşılmasını ve yönetilmesi çok daha zor bir hale gelebilir. Tek bir değişiklik uygulamanın başka bir kısmında beklenmedik sonuçlara yol açabilir.
Tek Hata Noktası: Uygulamanın bir kısmında oluşacak bir hata tüm uygulamanın çökmesine sebebiyet verebilir. Ayrıca tek bir hata genellikle tüm uygulamayı etkiler. Bu durum ise hata ayıklama ve sorun giderme sürecini zorlaştırabilir.
Teknoloji ve Dil Kısıtlamaları: Monolith uygulamalar genellikle tek bir programlama diline ve teknolojisine bağlıdırlar. Yani uygulamanın geliştirmeye başlanıldığı teknoloji ne ise uygulamanın bütün yaşamı boyunca geliştiriciler bu teknolojilere bağlı kalmak zorundadır. Bu durum farklı takımların farklı teknolojiler kullanmasını engeller. Yeni teknolojiler denemeyi zorlaştırır ve geliştiricilerin teknoloji seçeneklerini sınırlar.
Umarım bu kısıma kadar elimden geldiğince düzgünce artılarını ve eksilerini açıklayabilmişimdir. Dilerseniz Monolith uygulamaları hangi projelerde tercih etmeliyiz biraz da buna değinelim.
Küçük Ölçekli Projeler: Küçük ölçekli projeler genellikle monolith mimariler için en uygun olanlardır desek herhalde yanlış bir varsayım olmaz. Nispeten daha az kullanıcının kullandığı. Tek bir kod tabanın bakımının ve geliştirmesinin kolaylıkla yapılabildiği uygulamalar monolith uygulamalar için biçilmiş kaftan olabilirler.
Hızlı Prototip Üretme : Yeni bir fikri hızlı bir şekilde pazara çıkarmak ve son kullanıcı ile buluşturmak istiyorsanız monolith mimari tam sizin aradığınız çözüm olabilir. Tüm işlevleri tek bir uygulama içerisinde bir araya getirip hızlı bir prototip ortaya koymak için monolith mimari en ideal çözümdür.
Kısa Süreli Projeler: Projelerin sonuçları hızlı bir şekilde görülmesi gerekiyorsa monolith bir yapı oldukça uygun olacaktır. Özelliklerin hızlı bir şekilde eklenmesi ve test edilmesi çok daha kolay olacaktır.
Evet monolitik mimarileri elimden geldiği kadar açıklayabildiğimi düşünüyorum tabi ki konunun eksik tarafları mutlaka vardır. Gelelim asıl konumuz olan Microservice mimarilere eksileri, artıları nelerdir bunları değerlendirmeye çalışalım hep beraber.
Microservice Mimari
Microservice mimarisi sözlük anlamı ile bir uygulamanın genellikle birbirlerinden bağımsız küçük bir çok servise, hizmete adına ne derseniz deyin bölündüğü bir yazılım geliştirme tekniğidir. Bu küçük servisler belirli bir işlevi yerine getiren ayrı ayrı dağıtılabilen ayrı veri tabanlarına, farklı programlama dillerine sahip ve en önemlisi ölçeklendirilebilen modüllerdir. Bir hayal edelim elimizin altında bir e-ticaret web sitemiz olsun. Bu e-ticaret uygulamamızda bütün servislerimizin birbirinden ayrı olduğunu varsayalım yani kullanıcının giriş yaptığı “Auth” bir uygulama olsun veya almak istediği ürünü Sepete eklediği “Cart” servis başka bir uygulama olsun. Sipariş verdiği “Order” başka bir uygulama olsun ve bütün bu servisler birbirleriyle haberleşebilsinler. Bir servis her hangi bir teknik aksaklıktan dolayı problem yaşayıp çalışma hayatına geçici süre ile ara verse bile bu durum diğer servisleri etkilemesin mesela. Böyle bir açıklama yapınca umarım kafanız karışmamıştır diye umut ediyorum. Aslında tam olarak microservice mimarisinin de bize vermeye çalıştığı bu diyebiliriz. Birbirinden ayrı yaşam döngülerine sahip farklı programlama dillerinle geliştirilmiş, farklı takımların üstünde çalıştığı fakat günün sonunda ortak bir amaca hizmet eden web siteleri. İsterseniz microservis kavramını bir kaç anahtar kelime ile daha net açıklayalım.
Bağımsızlık : Her hizmet, tek başına veya belirli bir grupla bağımsız olarak çalışır.
Odaklı : Her microservis, genellikle belirli bir işlevi yerine getirmek için vardır. Bu, sunulan hizmetin basit ve anlaşılır olmasını, bakımını ve güncellemesini kolay hale getirir.
Dil Bağımsız: Microservisler genellikle dil bağımsız olup o servisin en çok ihtiyaç duyduğu dil de ve teknolojide yazılabilirler.
Ölçeklendirme : Her bir servis bağımsız olarak dağıtılabilir ve ölçeklendirilebilir, bu da bir hizmetteki bir sorunun diğerlerini etkilememesini sağlar ve belirli hizmetleri gerektiği ölçeklendirme özelliği sunar.
Ölçeklendirme demişken burada bir parantez açmak istiyorum.
Vertical Scaling vs Horizontal Scaling
Vertical scaling yada diğer adıyla scale up kavramını açıklayalım. Vertical Scaling bir sunucu veya veri tabanı sistemini daha fazla işlem yapması için geliştirmeyi ifade eder. Bunlar genellikle daha güçlü bir CPU, daha fazla RAM, daha fazla bir sabit disk vb. eklemek gibi eylemlerle yapılır. Örneğin bir sunucu hali hazırda 16 GB RAM’e sahipse bu yükseltirilerek 32 GB RAM’e çıkarılır bu işlem bir Vertical (Dikey) Scaling işlemidir.
Horizontal Scaling diğer adıyla “scale out” bir sistemi yükü paylaştırmak adına daha fazla sunucu ekleyerek genişletmeyi ifade eder. Yani uygulamamızın çalıştığı makinanın RAM gücünü arttırmak yerine daha fazla sunucu satın alarak yönetebilmeyi hedefler.
Bu iki kavramın hangisi daha mantıklı konusuna girmeyeceğim açıkçası fakat kaynakça kısmına bu konu ile alakalı bir kaç içerik bırakacağım konumuzdan sapmamak adına devam edelim isterseniz.
Microservis mimarisi, genellikle Horizontal scaling yöntemini destekler ve teşvik eder. Bu, her hizmetin ayrı ayrı ölçeklendirilebilir olması gerektiği anlamına gelir. Yani belirli bir servisimizin çok yoğun kullanıldığı bir durumda, bu hizmetin örneklerini arttırabilirsiniz. Diğer yandan Vertical scaling yöntemi genellikle monolitik uygulamalar için daha yaygındır. Bununla birlikte, bu yaklaşım genellikle daha pahalı ve daha az esnektir çünkü sunucularınız donanımını yükseltmek genellikle daha maliyetli olabilir ve bir noktada fiziksel sınırlamalar ile karşılaşabilirsiniz.
Microservis mimarisinin iyi yanlarından bahsettik isterseniz şimdi kötü taraflarına bakalım.
Dezavantajlar
Karmaşıklık: Her bir hizmetin ayrı ayrı yönetilmesi ve izlenmesi gerektiğinden, uygulamanın genel karmaşıklığı artabilir.
Veri Yönetimi : Her microservise kendi veri tabanını kullanır. Bu durum verinin tutarlılık ve bütünlük sorunlarına neden olabilir.
Ağ Gecikmesi : Microservisler üzerinde iletişim ağ üzerinde gerçekleşir, buda gecikme ve güvenirlik sorunlarına yol açabilir.
Hizmetler Arası İletişim : Hizmetlerin birbiriyle etkili bir şekilde iletişim kurabilmesi için düşünülmesi ve yönetilmesi gereken karmaşık etkileşimler ve bağımlılıklar vardır.
Eveet Yazımızın artık sonuna gelirken umarım bu iki kavram zihninizde daha fazla oturmuştur. Zira değinmediğimiz bir çok kavram var. Eksik gördüğünüz yerleri lütfen bana bildirin. Bir konu hakkında bir şeyler yazarken bende o konu hakkında bir çok yeni bilgi öğreniyorum diyebilirim. Bir sonra ki blog yazımda görüşmek üzere..
Bu konuyu araştırırken okuduğumda ve bilgi aldığım kaynaklar, videolar;
[Microservice Mimarisi Nedir ? Microservice Mimarisine Giriş
Microservice tek başına tek sorumluluğu olan ve tek iş yapan sadece o işe ait işleri yürüten modüler projelerdir.
gokhana.medium.com](https://gokhana.medium.com/microservice-mimarisi-nedir-microservice-mimarisine-giri%C5%9F-948e30cf65b1?source=post_page-----762ff8147ca4--------------------------------)
[Monolithic ve Microservice Mimariler Nelerdir?
Her çağın bir başlangıcı olduğu gibi bir sonu vardır. Nasıl ki öncekinin sönen yıldızı üzerine yeni doğanın altın çağı…
www.gencayyildiz.com](https://www.gencayyildiz.com/blog/monolithic-ve-microservice-mimariler-nelerdir/?source=post_page-----762ff8147ca4--------------------------------)
https://www.youtube.com/watch?v=CdBtNQZH8a4
[Monolithic ve MicroService Architecture'a Genel Bir Bakış
Merhaba arkadaşlar. Bu blog yazımdaki konum, her ne kadar yeni bir şey olmasada, son dönemlerde Martin Fowler ile…
www.gokhan-gokalp.com](https://www.gokhan-gokalp.com/en/monolithic-ve-microservice-architecturea-genel-bir-bakis/?source=post_page-----762ff8147ca4--------------------------------)