Mikroservis Mi Monolith Mi?

Bugün backend mecrasının içinde olduğu en popüler bu iki kavramdan bahsetmek istiyorum. Gelişen teknoloji sistemlere bakış açımızı ve yaklaşım prensibimizide değiştirdi. Önceleri bir makinamızı server olarak kullanırken daha sonraları sanal makinalar hayatımıza girdi.

Sanal makinalar dünyası belli bir dönem piyasayı domine edip götürdü. Daha sonra container teknolojileri ile birlikte israfı minimum kontrolü maksimum hale getirmiş olduk. Geçen bu uzun yıllar içinde her gün yeni bir bakış açısı bir veya birkaç teknoloji popüler oldu.

Günümüzdeki en popüler konulardan biri artık dilimize pelesenk olmuş mikroservis yapısı ve mimarisi. Yapı olarak tanım olarak herkesin duyduğu bu yapı, bu düşünüş tarzı kimlere göre kimler nasıl kullanmalı üzerinde ise kaynak ciddi miktarda az.

Biz yazılımcılar teknoloji bağımlısı haline geliyoruz. İşimiz sürekli öğrenmek üzerine olduğu için belli dönem bir şeyi yüceltirken belli dönem bir başka yaklaşım açısını övüyorken kendimizi buluyoruz. Bu yeni gelen teknolojinin çok iyi olduğunu anlamına gelmiyor. Genelde kaçırdığımız nokta bu oluyor. En iyi programlama dili , en iyi programlama yaklaşımı (object oriented, functional) olmadığı en iyi tasarım yapısıda olamaz. Mikroservis çok iyidir monolith çok kötü gibi yaklaşımları hrgün biraz daha fazla görüyorum. Teknoloji yada popüler kavramlara hakim olmak bence hala çok önemli olsada kullandığımız bir yapıyı dibine kadar anlamak daha önemli.

Bazen önemli olan bıçağın keskinliği değildir, bıcak kullananın yeteneği ve bilgisidir.

Mikro servis nedir ? Avantajları Nelerdir? Neden böyle bir şeye ihtiyaç oldu ?

Mikroservis temelinde kodların iş yapan parçacıkların bir yada bir bölümünün sistemin içinden ayrılarak kesilip alınması, ve bu alınan yapıların bağımsız bir sistem olarak geliştirilmesidir. Tüm yapıyı bir logo gibi hayal edersek her logo parçası bağımsız bir yapı oluşturmuş olsun. Biz bunları üst üste koymak yerine parçaladık.

Peki bunu neden yaptık ?

Bağımsız Deploy Edebilme

Monolith bir yapıda yani tüm servislerimiz herşeyimiz tek bir servis iken, en ufak bir değişiklik için tüm kodların yeniden deploy edilmesi gereklidir. Tek satır kod bile yazsanız kodun bir parçasını deploy edemediğinizden tüm kodların deploy ve test süreçlerini çalıştırmak zorundasınız.

Bu hem büyük bir yük hem avaliblity problemi doğurmakla beraber büyük bir tehtid oluşturur.

Anlam Sahipliği

Her servis bir işten sorumlu olduğunda herkesin bir anlamda sadece bir işi olmuş demektir. Bu bu düzlemdeki tüm logic işlemlerinin kendinden sorumluğu olduğu anlamına gelmektedir. Bunun güzelliklerinden biri o servisi bilmeyen bir takımın kendi yaptıkları geliştirmeler için başka servislerden endişe etmemesini sağlar.

Yeniden Tasarlanabilirlik

Sistemlerimiz ayaktayken örnek olarak mail gönderme tarafı için tamamen bambaşka yeni servisler tasarlayabilir test edebilir aynı anda birden fazla ve farklı servisi ayakta tutabiliriz. Bu çok büyük bir esneklik yeteneği kazandırır. Örnek olarak bir servis Grapql konuşurken bir servis rest cevapları verebilir.

Yazılım ve teknoloji esnekliği belkide işin en güzel parçalarından biridir. Her mikroservis bambaşka bir programlama dili ile yazılabilinir. Her programa dilinin aşa yukarı başarılı olduğu alanlar vardır. Hız , yazım kolaylığı ve güvenilirlik gibi avantaj ve dezavantajlar barındırırlar. Tüm yapıların en pozitif taraflarına toplama imkanımız olabilir.

Takım Çalışması Yatkınlığı

Büyük projeler çok sayıda yazılımcıya ihtiyaç duyar. Bir sürü yazılım takımları her işin bir ucundan tutarak birbirlerini durdurmadan iş yapmaya devam edebilirler. Tüm servisi yapıyı akışı bilmeseler bile kod yazmaya devam edebilirler. Bir iş uçtan uça birbirinden bağımsız geliştirilebilinir.

Scaling

Sisteme kritik bir parçası çökmediği sürece bazı servislerin cevap verememesi durumunda sistemin geneli bundan etkilenmez. Örnek olarak auth service çökerse sisteme kimse giremez ama girenler sistemi kullanmaya devam edebilir. Buda monolithe oranlar siyah ve beyaz ikileminden bizi kurtarır.

Monolith

Gelelim bu kıyaslamanın diğer yüzüne. Monolith yapılar tüm yapıların tek bir yerden yönetilmesine izin ve fırsat veren yapılardır. Monolithler sanılanın aksine birkaç farklı şekilde oluşturulabilinir.

The Single-Process Monolith

En çok gördüğümüz ve kullanılan en basit yapıdır. Tüm servis tek yapıdan oluşur kendi içi dışında bağımlılıkları yoktur. Bu, yapı klasik bir monolit anlayışına uysa da, karşılaştığım çoğu sistem bundan biraz daha karmaşık.

single-process monolithsingle-process monolith

The Modular Monolith

Tek işlemli monolitin bir alt kümesi olarak modüler monolit, tek işlemin ayrı modüllerden oluştuğu bir varyasyondur. Her biri bağımsız olarak üzerinde çalışılabilir, ancak yine de dağıtım için hepsinin bir araya getirilmesi gerekir.

Modular MonolithModular Monolith

The Distributed Monolith

Dağıtılmış bir monolit, birden fazla hizmetten oluşan bir sistemdir, ancak herhangi bir nedenle, tüm sistemin birlikte dağıtılması gerekir. Dağıtılmış bir sistemin tüm dezavantajlarına ve tek işlemli bir monolitin dezavantajlarına, her ikisinin de yeterli avantajına sahip olmadan sahiptir.

Avantajları Nedir?

Mikroservisleri göre birçok avantajı bulunmaktadır. Bu cümleyi üzerine basa basa söylemek istiyorum. Her zaman microservis çok iyidir güzeldir demek doğru değil. Bunun temel nedenlerine gelicek olursak,

Deployment

Tüm sistem tek seferde deploy olabildiği için ya siyah ya beyaz gibi bir durum oluşur. Ancak tek seferde deploy olan tek seferde testleri çalıştırılan bir sistem nispeten daha az kompleks olacaktır.

Log ve Monitoring

Mikroservis yapısında tüm sistemler birbirleri ile haberleşmek durumunda olduklarından, her birinin anlık takibi yapılması çok daha zor iken tek bir servisin loglarını okumak ve takip etmek nispeten çok daha kolay olacaktır.

Sonuç

Mikroservis yada monolith ikisinin birbirinden eşsiz avantajları var gibi duruyor. Hangisini tercih edeceğimize projede çalışan insan sayısı kullanını sayısı vb gibi bilgilere bakılarak karar verilmesi en doğrusu olacaktır.