Microservices Nedir?
Microservices yani mikroservis mimarisi farklı iş yeteneklerinin birbirinden bağımsız bir şekilde yapılandırıldığı mimari bir modeldir. Bu mimaride büyük sistemler her biri farklı bir işten sorumlu ve birbirinden bağımsız daha küçük servislere ayrılır. Sahne arkasında tüm bu servisler microservice (mikroservis) olarak adlandırılır.
Mikroservis kısaca bağımsız çalıştırılabilen, her birinin ayrı ve belirli bir sorumluluğu olan boyutu küçük servis demektir.
Bu yaklaşım SOA’dan (Service Oriented Architecture) ilham almıştır ve her ikisi de client-server yani istemci-sunucu mimarisinden gelmektedir. Mikroservis mimarisi, SOA’nın kendine özgü olacak şekilde bir uzantısı olarak görülebilir. Bu mimarilerin genel gelişim süreci şu şekildedir:
Yalnız mikroservis mimarisi servis odaklı mimarinin (SOA) tasarım ilkeleri birebir aynı değildir. SOA ile arasında farklılıklar bulunmaktadır. Service Oriented Architecture kurumsal seviyede bir mimari iken Microservice Architecture uygulama seviyesinde bir mimaridir. Önemli diğer farklılıkları ilgili başlık altında inceleyebilirsiniz.
İlk olarak Martin Fowler ve James Lewis tarafından tartışılan mikroservis mimarisi dağıtım kolaylığı, esneklik ve ölçekleme gibi çeşitli avantajlar sağlar.
Mikroservis mimarisinin en önemli özelliklerinden biri veri yapılarını paylaşmamasıdır. Her mikroservis kendi veri depolama alanına sahiptir (veritabanı şeması veya tablo gibi.) Yani her biri kendi veri modelinden ve verilerinden sorumludur. Diğer servisler sahibi olmadığı depolama alanına erişemezler.
Mikroservisler API adı verilen arayüzler aracılığıyla basit protokolleri kullanarak iletişim kurabilirler. Şu aşamada interface ile iletişim kurabildiklerini bilmek yeterlidir.
Genel olarak API Gateway adı verilen sisteme tek giriş noktası oluşturulur. Sisteme istek yapan kullanıcılar doğrudan mikroservislere istek yapmak yerine bunun üzerinden istek yapar. Burada yönlendirme, yetkilendirme gibi işlemler yapılır. Bu işlem için arka planda birden fazla mikroservise istek yapılabilir. Sonunda kullanıcıya tek bir sonuç dönülür.
Mikroservis mimarisinin genel yapısı şu şekildedir:
Microservice kavramını daha iyi anlayabilmek için öncelikle monolitik mimarinin ne olduğunu ve iki mimari arasındaki farkların ne olduğunu bilmek gerekir. Microservices detaylarına girmeden önce monolitik mimari nedir buna bakalım.
Microservices ve Monolitik Uygulamalar
Monolit (monolith) terimi, IT yani Information Technologies – Bilgi Teknolojileri camiasında modülleri bağımsız olarak çalıştırılamayan tek parça yazılım uygulamalarını ifade eder. Monolithic architecture olarak bilinen geleneksel monolitik mimaride uygulamanın tamamı bir bütün olarak geliştirilir.
Monolitik uygulama tek parça olarak düşünülebilir. Burada tüm fonksiyonlar tek bir paketten sağlanır.
Monolitik mimari, uygulamanın dağıtımı için kolay bir yapı sağlar. Tek bir paketle tüm sistem devreye alınır, yaygınlaştırması yapılır. Uygulamayı ölçeklendirmek için de yani aynı uygulamanın çalışacağı altyapıyı ayarlamak için de uygulamanın çalıştığı sunucuları bir loadbalancer (yük dengeleyici) arkasında ekleyip çıkarmak yeterlidir.
Büyük monolitik uygulamalarda failover cluster adı verilen uygulamanın birden fazla sanal veya fiziksel sunucuda çalıştığı sunucu kümesi kullanılır. Yani bütün servislerin olduğu aynı uygulama paketi birçok sunucuda çalışır. Bu sayede uygulama sahipleri bir makinede sorun olursa loadbalancer ayakta olan diğer makinelere trafiği vererek kesinti olmamasını hedefler.
Ancak genel olarak uygulamanın tek parça olması hem büyük hem karmaşık olmasına neden olur. Birbirine sıkı bir şekilde bağlı bileşenlerden birinin çökmesi tüm sistemi etkiler. Yani monolitik sistem başarısız olursa verilen her hizmet çalışmayı durdurur.
Ayrıca monolitik uygulamalar yüksek maliyetli ve zaman alıcı işleri nedeniyle çok esnek değildir.
Örnek bir monolitik uygulama:
Mikroservices çalışma mantığında ise yalnızca bir paketin bulunduğu monolitik mimarinin aksine her bir servis farklı bir paket olarak ele alınır. Mikroservis mimarisi, dağıtım kolaylığı, esneklik ve ölçekleme gibi avantajlar sağlar.
Aynı uygulamanın mikroservis örneği:
Microservices Neden Kullanılır? Avantajları Nedir?
Mikroservis mimarisinin amacı ve hedefleri nedir? Bu yazıda tasarım prensipleri başlığında aslında detaylı olarak özelliklerini, avantajlarını ve neden geliştirildiğini tasarım bazında görüyoruz. Burada neden kullanıldığını ve avantajlarını genel bağlamda görelim.
Bu mimari servislerde sık güncelleme ihtiyacı olan uygulamaların modern ihtiyaçlarını karşılamak için alternatif bir mimari olarak geliştirilmiştir. Mikroservis mimarisinin temel amacı uygulamayı küçük bağımsız servislere bölmektir. Microservices daha önce de belirttiğimiz gibi farklı ve benzersiz iş yetenekleri olan bağımsız süreçlerin oluşturduğu bir mimaridir.
Çok sık ölçeklendirme gereken bir uygulamada bu mimari önemli faydalar sunar (scalability-ölçeklenebilirlik prensibi.) Onun için sık ölçeklendirme ihtiyacı varsa bu mimari kullanılabilir. Örneğin bir servise yapılan istek diğer servislere nazaran çok arttıysa sadece bu servisin sayısını artırabiliriz. Monolitik uygulamada olduğu gibi tüm sistemi artırmamıza gerek kalmaz.
Ya da başka bir örnek; haftanın bazı günlerinde kampanya çıkılan bir uygulamayı düşünelim. Bu uygulamada trafik kampanya günleri çok yüksek, diğer günler çok düşük olacaktır. Bu günlere özel olarak ölçeklendirme yapabiliriz. Bunun için auto-scaling özelliği olan PaaS ürünleri de bulunmaktadır. Tabi bunu auto-scaling olmadan da düzenleyebiliriz.
Büyük bir sistem ve burada çalışması gereken çok sayıda insan kaynağı varsa, böl parçala yönet mantığıyla iş akışları ayrılarak burada microservices uygulanabilir.
Bir servisin durması, hata vermeye başlaması (availability-kullanılabilirlik oranının düşmesi) sistemin diğer fonksiyonlarını etkilememesi için kullanılabilir. Bu prensip isolation of failure (hata izolasyonu) olarak geçer.
Bazı hizmetlerin, fonksiyonların sürekli güncellenmesi gerekiyorsa bu mimari ile tüm sistemin elden geçirilmesi gerekmez. Çünkü servisler birbirinden tamamen bağımsızdır. Bu da iş birimlerinin pazara çıkma hızını artırmasına yardımcı olur.
Ayrıca günümüzün iş gereksinimlerine ve çözümlerine ayak uydurmak için günümüzün programlama dillerinde veya teknoloji ürünleriyle eski uygulamaları yeniden yazmanız gerektiğinde de kullanabilirsiniz.
Microservices Avantajları
Bu konuları microservices’in avantajları olarak maddeler halinde toparlayalım:
»
Servisleri geliştirme ve devreye almada birbirlerinden tamamen bağımsız hale getiren mikroservis mimarisi modularity, loose coupling ve high cohesion prensiplerini destekler.
»
Mikroservis mimarisinin büyük sistemleri işlevsel olarak bir dizi bağımsız servisleri birbirinden ayırması artan karmaşıklığı yönetmemize yardımcı olur. Bu bize esneklik (resilience, flexibility) sağlar. Örneğin her bir servis birbirinden bağımsız olarak deploy edilebilir yani çalışır halinin dağıtımı sağlanabilir. Bir servisten hata alınması diğer servisleri veya tüm sistemi etkilemez (isolation of failure – hata izolasyonu).
»
Her bir servisin tasarımı, geliştirilmesi, testleri, operasyonel işlemleri için dedike küçük bir takım atanır. Yani her geliştirici sistemin tamamını değil sadece sorumlu olduğu alanı bilir. Yani geliştirilmesi ve bakımı kolaydır. Bu da hem geliştirici için kolaylık sağlar hem de projenin veya sistemin kaynak bağımlılığını azaltır.
»
Mikroservis mimarisinde de yatay ölçeklendirme (horizontal scaling) kolay bir şekilde yapılabilir. Yatay ölçeklendirme yani horizontal scaling kısaca yeni bir sunucu ekleyerek kümeyi büyütme; dikey ölçeklendirme yani vertical scaling ise mevcut sunucuların core / memory ile kapasitelerini büyütme demektir. Ölçeklendirme ihtiyacı bu mimariyi kullanıp kullanmamaya karar verirken en önemli ölçütlerden biridir. Bu mimariyi tercih ederken ölçeklendirmeye ne kadar ihtiyacınız olduğunuzu değerlendirebilirsiniz.
»
Servisler bağımsız olduğu için kullanılacak teknoloji bağımlılığı da olmayacaktır. Bir servis geliştirilirken kullanılan dil veya başka bir ürünü diğer servis için kullanma zorunluluğu bulunmaz.
»
Her bir mikroservis kendi veri modeline sahip olduğundan bu mimari daha iyi veri güvenliği sağlar. Hassas veriler için geliştiriciler daha güvenli API kullanır. Servisi kullanacak olanlar için kimin verilere erişebileceği servis özelinde kontrol edilebilir.
»
Her bir servisin ayrı olarak geliştirilebilmesi pazara daha hızlı çıkma imkânı sunar. Örneğin monolitik bir uygulamanın bir modülünde yapılan geliştirme için tüm sistemin regresyon testine girmesi gerektiği gibi burada öyle bir durum yaşanmaz. Bağımsız oldukları için sadece bu servis için tamamlanması yeterli olacaktır.
Microservices Ne Zaman Kullanılmamalıdır?
Bunu netleştirmek için öncelikle uygulamayı mikroservislere bölmeye ihtiyaç olup olmadığını sormamız gerekir. Microservice architecture sistem karmaşıklığını çözmede yardımcı olur. Onun için karmaşık yani kompleks sisteminiz yoksa kullanmanıza gerek yoktur.
Çok sık ölçeklendirmeye ihtiyacınız yoksa kullanılmasına ihtiyaç olmayacaktır.
Uygulama kapsamı çok net değilse operasyonel eforlar, geliştirme eforları, bakım gibi konularda ek yük ve maliyet çıkabilir.
Kurumlar ya da geliştirme ekipleri genellikle modaya uyarak genellikle mikroservis dünyasına atlamaya ve bir an önce kullanmaya hazırdır. Geçişi sırf bunun uğruna yapmak işletmelerin Conway yasasında belirtilen duruma gitmesine neden olabilir. Conway’s Law kısaca uygulamaların mimari yapılarının, kullanıcıların ihtiyaçlarına değil de uygulamayı oluşturan ekibin yapısına yakından benzeme eğiliminde olduğunu belirten bir özdeyiştir.
Genelde büyük işletmelerde bu değişim esnasında bir iki mikroservisi küçük ekiplere atamak yerine büyük ekiplerin birçok mikroservisi geliştirme eğilimi olabilir. Bu mikroservisler de kullanıcı gereksinimlerine göre değil de ekibin yapısına göre şekillenebilir. Bu da istenen bir durum değildir.
Ayrıca daha teknik açıdan bakacak olursak; bu mimaride sistematik sorunları bulmak daha zordur. Örneğin sorun analizi için genelde birden fazla log dosyasını birleştirme ihtiyacı olur.
Microservices Mimari Tasarım Prensipleri
Microservices mimarisinin tasarım hedefi olarak bazı prensipleri vardır. Bu prensipler mimarinin karakteristikleridir. Bu prensipleri mikroservis mimarisinin özellikleri olarak düşünebiliriz.
Bu prensipler (veya ilkeler) bize bu mimariyle nasıl bir yapıya veya hangi avantajlara sahip olacağımızı gösterir.
Bu mimari için çeşitli prensipler de dile getirilmektedir ama biz burada bazı araştırmalara göre en çok mutabık kalınan 7 prensibi görelim:
Decentralization (Merkeziyetsizlik)
Decentralization Türkçe’de merkezi olmama durumu ya da eskilerin tabiriyle adem-i merkeziyetçilik demektir. Yazılım mimarisi dünyasında da aynı şekilde bir merkeze bağlı olmama, sorumluluğun dağıtılması anlamına gelir.
Sistem içindeki bütün işlerin tek bir merkez tarafından yönetilmeyeceği ve kontrol edilmeyeceği anlamına gelen bir sorumluluk dağılımıdır.
Bu prensibe göre mikroservis hangi teknolojiyi kullanıyor olursa olsun tek bir göreve sahip olmalıdır ve kendi bireysel yönetim planı olmalıdır.
Mikroservis tabanlı uygulamalarda veri yönetiminden iş akışlarının çalıştırılmasına kadar her yönden decentralization gerçekleşmelidir. Bu ilke mikroservislerin veri, geliştirme, operasyonel işler veya ekip çalışmalarında yüksek derecede bağımsızlık sergilemesi gerektiğini belirtir.
Loose Coupling (Serbest, Gevşek veya Zayıf Bağlantı)
Bu tasarım ilkesi, SOA yazısında da belirtildiği gibi, hizmetlerin, hizmetler arasında en az bağımlılık olacak, ideal olarak hiçbir bağımlılık olmayacak şekilde uygulanması gerektiğini belirtir. Tight coupling yani sıkı bağlantının tersidir.
Örneğin nesne yönelimli programlama ile ilgili olarak; bir sınıfın objesinin oluşturulduğu başka bir sınıf düşünelim. Objesi oluşturulan sınıfta değişiklik yapıldığında diğer sınıfta da değişiklik yapılması gerekiyorsa arada tight coupling vardır.
Autonomy (Servislerin Özerk Olması)
Mikroservisler bir iş için gerekli tüm sorumluluğu alır ve bu iş için tamamen bağımsız bir şekilde çalışır. Yani sağlanacak hizmet için tam kontrole sahiptir ve bağımlılık olmadan ilgili hizmeti karşılaması gerekir. Otonom bir servis, kendi API/protokolünü yayınlayarak işini yapar.
Otonom veya özerk olma durumunun bir başka yönü de hata senaryolarını gidermek için tüm bilgilerin servis içinde mevcut olmasıdır ve ek iletişim ve koordinasyon ihtiyacını ortadan kaldırır.
Bu prensiple birlikte ekipler ortaya çıkardıkları yazılımın tüm yaşam döngüsü ve operasyonel yönleriyle de bağımlılıktan kurtulur.
Ayrıca yazılım geliştirmek için kullanılacak teknoloji ve kullanılacak altyapı konusunda da servisler bağımsızdır.
Isolation of Failures (Hataların İzolasyonu)
İzolasyon, birden fazla işlemin (transaction) müdahale etmeden aynı anda birbirinden ayrı bir şekilde çalışabilir olması anlamına gelir. İzolasyon bir işlem sırasında yapılan herhangi bir ara durum değişikliğinin diğer işlemler tarafından görülmemesi sağlanarak yapılır.
Mikroservis mimarisinin temel özelliklerinden biri bileşenlerin ve yeteneklerin birbirinden yalıtılmasıdır. Bir mikroservis çökerse geri kalanı bu servis çalışana kadar etkilenmeden çalışmasına devam etmelidir.
Bu prensip hataların ayrı olarak ele alınması gerektiğini belirtir. Bir servisteki başarısızlık uygulamanın diğer bölümlerini etkilememelidir.
Independent Deployability (Bağımsız Devreye Alma)
Microservices’in önemli bir prensibi de independent deployability yani bağımsız yaygınlaştırmadır. Bu prensip bir uygulamayı oluşturan her bir mikroservisin ayrı olarak devreye alınabilmesi gerektiğini belirtir.
Bağımsız devreye alma servislerin zayıf, gevşek bağlantıyı da (loose coupled) sağlayarak başka hiçbir şeyi değiştirmek zorunda kalmadan bir serviste güncellemenin devreye alınabileceği anlamına gelir. Aslında görüleceği üzere prensipler de birbirleriyle sıkı bir ilişki içerisindedir.
Servisler için code base (kod tabanları) küçük, ayrı, bağımsız bir şekilde oluşturulur ve devreye alınır. Servislerdeki değişiklikler diğer devreye alım birimini de tetikleyebilir.
Scalability (Ölçeklenebilirlik)
Bu prensip microservices’in kullanılıp kullanılmayacağına karar verilmesi için göz önünde bulundurulması gerekecek kadar önemi haiz prensiplerden biridir.
Scability (ölçeklenebilirlik) kısaca; bir sistemin performansına göre, aldığı yüke göre veya başka bir etmene göre kapasitesini ve kabiliyetini artırmaya / azaltmaya denir.
Bu prensip basitçe şunu der: her bir mikroservis ve bu mikroservislerin sahip olduğu görev ölçeklenebilir olmalıdır. Her görevin diğerinden bağımsız olması yalnızca gerekli bileşenleri ölçeklendirmeyi kolaylaştırır. Zamandan ve kaynaklardan tasarruf sağlar.
Monolitler ölçeklenebilirliği sınırlar. Gelen isteklerin artışlarını karşılayabilmek için olağan strateji uygulamanın tamamının başka numunelerini başka kaynaklar üzerinde ayağa kaldırmaktır. Bu şekilde gelen yük uygulamanın ayakta olan bu paketlerine dağıtılacaktır. Ancak artan yükün uygulamadaki sadece bir modülü zorlaması tüm uygulama için yeni kaynakların tahsisinin elverişsiz olmasına ve ortaya verimsiz bir ortam çıkmasına sebep olur.
Modularity (Modülerlik)
Bu prensip, bir mikroservisin yalnızca bir görevi yerine getirmesi ve bunu iyi yapması gerektiğini belirtir. Modülerlik farklı işlevin farklı modül tarafından üstlenilmesi ve bu modüllerin sistemi oluşturmasıdır.
Bir sistem, tam işlevsellik sunan tek bir pakete sahip olmak yerine her bir bileşenin genel sistem davranışına katkıda bulunduğu izole bileşenlerden oluşur.
Modülerlik prensibi ile herhangi bir modül (arabanın bir parçasının değiştirilmesi gibi) sistemin diğer bir parçası, bir mikroservis değiştirilebilir, güncellenebilir.
Bu prensip sorumlulukların ayrılması (separation of concerns) veya işlevsel ayrım (functional separation) prensibi olarak da düşünülebilir.
Microservices için Teknoloji Seçimi ve Alternatifler
Microservice architecture yani mikroservis mimarisini nasıl oluşturabiliriz? Hangi teknolojileri kullanabiliriz? Bu bölümde biraz biraz daha teknik ve spesifik noktalara değineceğiz.
Bu mimari için uygun farklı teknolojiler mevcuttur. Hatta daha önce belirttiğimiz gibi aynı uygulamada farklı mikroservisler farklı teknoloji ve altyapıyı kullanabilir. Yani her bir mikroservis farklı teknolojilerle geliştirilebilir.
Ancak mikroservis mimarisi çok sayıda operasyonel yükle birlikte gelir. Bu nedenle teknolojileri harmanlamak yükü artırabilir.Bu maliyetten kaçınmak için işletme ihtiyaçlarına göre belirli bir standart oluşturabilirsiniz. Teknolojileri, özellikle programlama dillerini seçerken mimarinin tasarım prensiplerine göre değerlendirme yapılması faydalı olacaktır.
Mikroservisler çok sayıda programlama dili ve framework ile geliştirilebilir. İşte önde gelen bazılarını görelim.
Microservices için Önde Gelen Bazı Framework ve Diller
1. Java
Java mikroservis mimarisi için harika programlama dillerinden biridir. Java, mikroservis geliştirmeyi ve devreye alımı destekleyen birçok fikir ve altyapı içerir. Java ve Java teknolojileri Microservices için yaygın olarak kullanılır. Örneğin burada Spotify şirketinin bu adreste Java’yı da kullandığını görüyoruz.
Java’da mikroservis oluşturmak için yaygın kullanılan bazı framework’ler şunlardır:
Spring Boot: Mikroservisler için çok popüler bir kütüphanedir. Çünkü uygulamaları hayata geçirebilmek için kurulum ve yapılandırma/konfigürasyon sürecinin çoğunu basitleştirir. İlk defa mikroservislere başlayacaksanız Spring Boot ile başlayabilirsiniz.
Jersey: Bu, REST web servislerinin geliştirilmesini basitleştirmek için kullanılan bir Java framework’tür. Mikroservisler arasındaki iletişim katmanına yardımcı olur.
Swagger: API oluşturmak için kullanılır. Aynı şekilde mikroservisler arasındaki iletişim katmanına yardımcı olur.
Dropwizard: Stabil ve olgunlaşmış Java kütüphanelerini basit bir paket olarak sunar.
2. Go/Golang
Mevcut projenizi geliştirmek istiyorsanız, Golang mikroservis geliştirme için iyi bir seçim olabilir. Go olarak da bilinen Golang, mikroservis mimarisi açısından eşzamanlılığı ve API desteği olduğundan dolayı popülerdir. Web servisleri geliştirmek için güçlü bir standart içerir. Büyük ve karmaşık uygulamalar oluşturmak için özel olarak tasarlanmıştır. Go, GoMicro ve Go Kit olarak mikroservis geliştirme için iki etkili framework sunar.
3. Python
Python, çeşitli teknolojilerle entegrasyona aktif destek sunan üst düzey bir programlama dilidir. Python’da prototip oluşturma diğerleriyle karşılaştırıldığında daha hızlı ve daha kolaydır. Python’da mikroservisler, ASP ve PHP gibi eski dillerle de uyumluluk sağlar.
Python’da microservice geliştirenler, nesneleri uzaktan manipüle etmek için web protokollerini veya çeşitli yazılımları kullanmanın bir yolu olarak RESTful API yaklaşımını kullanır. Bu teknolojiyle artık bileşenlere ayrıldığı için uygulamayı izlemek daha kolay hale gelir.
Web uygulaması geliştirmeniz için aralarından seçim yapabileceğiniz çok çeşitli Python mikroservis framework’leri vardır. Önemli bazıları şunlardır: AIOHTTP, Flask, Falcon, Bottle, DJango, Nameko, CherrPy.
4. .Net
Microsoft’un geliştirmiş olduğu .Net Framework de mikroservisler için API geliştirilmesini oldukça kolaylaştırır. Masaüstü, mobil, web, oyun ve daha fazlası dahil olmak üzere geliştirdiğiniz herhangi bir uygulamadan mikroservisleri kolayca kullanabilen API’lere sahiptir. .Net Docker image’ları için hazır kurulum sunar. Yani sadece mikroservisleri oluşturmaya odaklanmamıza yardımcı olur.
Burada oluşturulan mikroservisler de Java, Node JS veya başka herhangi bir dilde yazılmış uygulamalarla kombine edilebilir. Benzer şekilde .Net mikroservisleri tüm önde gelen cloud platformlarında çalışabilir.
5. Node JS
Node JS de tercih edilen platformlardan biridir. Node JS ile sağlanan JavaScript modülleri uygulama geliştirmeyi büyük ölçekte basitleştirir. Yazılım mimarları, JSON API tabanlı uygulamaların, I/O bağlantılı uygulamaların ve yoğun veri akışı olan uygulamaların geliştirilmesi için Node JS’i tercih etmektedirler. Node.js ile microservice uygulamaları oluşturmak için JavaScript’in temel anlayışını kavramak önemlidir.
Microservices vs SOA: İki Mimari Arasındaki Farklar
Bu iki mimarinin farklılıklarını, ortak yönlerini önemli maddeler üzerinden SOA – Service Oriented Architecture yazısında detaylı bir şekilde inceleyebilirsiniz.
Son Notlar
Mikroservisler, dağıtık uygulamalar, ürünler veya çözümler için geçerli olan kapsamlı bir kavramdır. Her servisin sınırlarını başlangıçta tanımlamak zor olduğu için bir yazılım geliştirme projesinde mikroservis mimarisine sıfırdan başlanması önerilmez.
Mikroservisler için mükemmel teknolojiye karar vermek için belirleyici bir durum yoktur. Her teknoloji kararı, uygulamanızın diğer bölümlerini geliştirmek için kullanacağınız araçlara bağlıdır. Aynı zamanda geliştirme ekibinizin mevcut bilgisine de bağlıdır.