Uyarı: büyük yazı, bazı görüşler, belirsiz 'sizin için en iyi olanı yapın' sonucu.
Genellikle bu, veritabanınızın etrafına "altıgen mimari" uygulamanın bir aracı olarak yapılır. Web uygulamalarına, mobil uygulamalara, masaüstü uygulamalarına, toplu ithalatçılara ve arkaplan işlemlerine sahip olabilirsiniz, hepsi de veritabanınızı aynı şekilde tüketir. Kesinlikle aynı şeyi bir dereceye kadar veritabanınıza erişmek için zengin bir kütüphane yazarak ve tüm işlemlerinizin o kütüphaneyi kullanmasını sağlayarak başarabilirsiniz. Ve gerçekten de, çok basit bir sisteme sahip küçük bir dükkandaysanız, bu aslında gitmesi daha iyi bir yol; Daha basit bir yaklaşım ve daha karmaşık bir sistemin gelişmiş özelliklerine ihtiyacınız yoksa, neden karmaşıklığı ödeyesiniz? Ancak, her biri veritabanınızla ölçeklendirilmesi gereken büyük ve sofistike bir sistem kümesiyle çalışıyorsanız,
Platform bağımsızlığı ve bakımı
Bir veritabanınız varsa ve bu veritabanıyla etkileşimde bulunmak için bir Python kütüphanesi yazarsanız ve herkes veritabanıyla etkileşimde bulunmak için o kütüphaneyi çekerse, bu harika. Ancak diyelim ki bir mobil uygulama yazmanız gerekiyor ve bu mobil uygulamanın şimdi de veritabanıyla konuşması gerekiyor. Ve iOS mühendisleriniz Python kullanmıyor ve Android mühendisleriniz Python kullanmıyor. Belki iOS çalışanları Apple'ın dillerini kullanmak ister ve Android mühendisleri Java'yı kullanmak ister. Sonra veri erişim kitaplığınızı 3 farklı dilde yazarken ve sürdürürken sıkışıp kalacaksınız. Belki iOS ve Android devs, paylaşabilecekleri kodu en üst düzeye çıkarmak için Xamarin gibi bir şey kullanmaya karar veriyor. Mükemmel, muhtemelen veri erişim kitaplığınızı .NET'e aktarmanız gerekecek olması dışında. Ve sonra şirketiniz az önce başka bir şirket satın aldı. ın web uygulaması farklı ancak ilgili bir üründür ve işletme, şirketinizin platformundaki verilerin bir kısmını yeni edinilen bağlı kuruluşun platformuna dahil etmek istemektedir. Sadece bir sorun var: Bağlı kuruluş bir başlangıçtı ve başvurusunun büyük bölümünü Dart'a yazmaya karar verdi. Ayrıca, Xamarin'e pilotluk yapan mobil ekip, hangi sebeplerden dolayı (muhtemelen sizin kontrolünüz dışındaki sebeplerden ötürü) onlar için olmadığına ve geliştirecekleri mobil cihazlara özgü araç ve dilleri kullanmaya karar verdiklerine karar verdi. Ancak bu aşamada iken, ekibiniz zaten .NET'teki veri erişim kitaplığınızın büyük bir bölümünü teslim etmişti ve şirketteki başka bir ekip çılgınca bir Salesforce entegrasyon malzemesi yazıyordu ve hepsini o zamandan beri .NET'te yapmaya karar verdi. için zaten bir veri erişim kütüphanesiydi.
Şimdi, çok gerçekçi bir olay nedeniyle, veri erişim kitaplığınızı Python, .NET, Swift, Java ve Dart ile yazılmış. Onların da olmasını istediğin kadar iyi değiller. Bir ORM'yi istediğiniz kadar etkili kullanamazsınız, çünkü her dilin farklı ORM araçları vardır, bu nedenle istediğinizden daha fazla kod yazmanız gerekirdi. Ve her bir enkarnasyona istediğin kadar zaman ayıramadın, çünkü 5 tanesi var. Kütüphanenin Dart versiyonu özellikle tüylüdür çünkü bazılarının kendi işlemsel işlemlerini yapmanız gerekiyordu çünkü kütüphaneler ve destek gerçekten orada değildi. Bu nedenle, Dart uygulamasının veritabanınız için salt okunur bir işlevselliğe sahip olması gerektiğini ortaya koymaya çalıştınız. ancak işletme, planladıkları her hangi bir şeyin ekstra bir çabaya değmeyeceği konusunda çoktan karar vermişti. Ayrıca, veri erişim kitaplığınızın bu enkarnasyonlarında var olan bazı doğrulama mantığında bir hata olduğu ortaya çıktı. Şimdi bu hatayı tüm bu kitaplıklarda düzeltmek için testler ve kodlar yazmalı, bu kitaplıkların tümünde yaptığınız değişikliklerle ilgili kod incelemeleri almalı, bu kitaplıkların hepsinde KG almalı ve değişikliklerinizi tüm sistemlerde yayınlamanız gerekir. bu kütüphaneler. Bu arada, müşterileriniz memnuniyetsizdir ve Twitter'a girmiştir, asla hayal edemeyeceğiniz zayıflık kombinasyonlarını bir araya getirmek, şirketinizin amiral gemisi ürününü hedef almak yerine tek başına tasarlanmıştır. Ve ürün sahibi durum hakkında çok fazla bir anlayışa sahip olmaya karar verir.
Lütfen bazı ortamlarda, yukarıdaki örneğin kabul edilenden başka bir şey olmadığını anlayın. Ayrıca, bu olaylar dizisinin birkaç yıl boyunca ortaya çıkabileceğini de dikkate alın. Genel olarak, mimarların ve iş adamlarının veritabanınıza başka sistemler kurmaktan bahsetmeye başladıkları noktaya geldiğinizde, o zaman 'veritabanının önüne bir REST API koymak' yol haritanıza almak isteyeceksiniz. Erken bir tarihte, bu veritabanının birkaç sistem tarafından paylaşılmaya başlayacağının açık olduğu durumlarda bir web servisinin / REST API'sinin önüne konulduğunu düşünün. Doğrulama hatasını düzeltmek çok daha hızlı ve kolay olacaktır çünkü 5 kez yerine bir kez yapıyorsunuz. Ve düzeltmeyi bırakmak koordinasyonu daha kolay olurdu, çünkü siz
TLDR; Veri erişim mantığını merkezileştirmek ve çok ince HTTP istemcileri sağlamak, veri erişim mantığını verilere erişmesi gereken her uygulamaya dağıtmaktan daha kolaydır. Aslında, HTTP istemciniz meta verilerden bile oluşturulmuş olabilir. Büyük sistemlerde, REST API daha az kod korumanızı sağlar
Performans ve ölçeklenebilirlik
Bazı insanlar ilk önce bir web servisinden geçmek yerine doğrudan veritabanıyla konuşmanın daha hızlı olduğuna inanabilirler. Tek bir uygulamanız varsa, bu kesinlikle doğru. Fakat daha büyük sistemlerde, bu düşünceye katılmıyorum. Sonunda, bir ölçek düzeyinde, veritabanının önüne bir tür önbellek koymak çok faydalı olacaktır. Belki Hibernate kullanıyorsunuz ve bir Infinispan ızgarasını L2 önbelleği olarak kurmak istiyorsunuz. Web hizmetinizi uygulamalarınızdan ayrı bir şekilde barındırmak için 4 etli sunucu kümeniz varsa, eşzamanlı çoğaltma açık olarak katıştırılmış bir topolojiye sahip olabilirsiniz. Bunu 30 uygulama sunucusundan oluşan bir kümeye koymaya çalışırsanız, bu kurulumda çoğaltmayı açma ek yükü çok fazla olacaktır. ya Infinispan'ı dağıtılmış modda ya da bir çeşit özel topolojide çalıştırmak zorunda kalırsınız ve aniden Hazırda Bekletme'nin önbellekten okumak için ağ üzerinden çıkması gerekir. Artı, Infinispan sadece Java ile çalışır. Başka dilleriniz varsa, başka önbellekleme çözümlerine ihtiyacınız olacaktır. Veritabanına ulaşmadan önce uygulamanızdan web servisinize gitme zorunluluğu olan ağ ek yükü, genellikle kendi ek yüküyle birlikte gelen çok daha karmaşık önbellek çözümlerinin kullanılması gereği ile hızlı bir şekilde telafi edilir.
Ek olarak, REST API'nizin bu HTTP katmanı, başka bir değerli önbellekleme mekanizması sağlar. REST API'niz için sunucularınız önbellekleme başlıklarını yanıtlarına koyabilir ve bu yanıtlar son derece iyi ölçeklenen ağ katmanında önbelleğe alınabilir. Küçük bir kurulumda, bir veya iki sunucuyla en iyi tercihiniz, veritabanında konuştuğunda uygulamada yalnızca bir hafıza içi önbellek kullanmaktır, ancak birçok sunucuda çalışan birçok uygulamanın bulunduğu büyük bir platformda, Önbelleğe almanız için ağ. Çünkü düzgün bir şekilde yapılandırıldığında kalamar veya vernik veya nginx gibi bir şey göreceli olarak küçük donanımlarda çılgınca seviyelere kadar ölçeklenebilir. Her saniyedeki yüz binlerce veya milyonlarca istek, bir HTTP önbelleğinden, bir uygulama sunucusundan veya bir veritabanından daha ucuzdur.
Bunun da ötesinde, bir tona kadar istemcinin hepsinin veritabanınıza işaret etmesi, hepsinin de veritabanına işaret eden birkaç sunucuyu işaret etmesi yerine, veritabanını ve bağlantı havuzlamasını çok daha zor hale getirmesi gerekir. Genel olarak, bir uygulama sunucusundaki asıl iş yükünün çoğu uygulama öğesidir; verilerin veritabanından geri gelmesini beklemek genellikle zaman alır, ancak genellikle çok hesaplı olarak pahalı değildir. Uygulamanızın iş yükünü ele almak için 40 sunucuya ihtiyacınız olabilir, ancak verileri veritabanından almayı düzenlemek için muhtemelen 40 sunucuya ihtiyacınız yoktur. Bu görevi bir web hizmetine ayırırsanız, web hizmeti büyük olasılıkla uygulamanın geri kalanından daha az sayıda sunucuda çalışacaktır, bu da veritabanına daha az bağlantı yapmanız gerektiği anlamına gelir. Bu önemli, çünkü veritabanları genellikle
TLDR; Farklı bir dil ve teknolojiyi kullanan birçok farklı uygulamada gerçekleşen bir şey olduğundan, tek bir adanmış web servisinin içinde olan bir şey olduğunda veri erişiminizi ayarlamak, ölçeklendirmek ve önbelleğe almak daha kolaydır.
Son düşünceler
Lütfen bu düşünceden uzak durmayın "Vay, verilerimi almak için her zaman REST API'lerini kullanmalıyım" veya "Bu salak yanlış yaptığımızı söylemeye çalışıyor, çünkü web uygulamamız doğrudan veritabanına konuşuyor, ama eşyalarımız iyi çalışıyor! " . Yapmaya çalıştığım en önemli nokta, farklı sistemler ve farklı işletmelerin farklı gereksinimleri olduğu; Çoğu durumda, veritabanınızın önüne bir REST API koymak gerçekten bir anlam ifade etmiyor. Bu karmaşıklığı haklı çıkarmayı gerektiren daha karmaşık bir mimaridir. Ancak karmaşıklık garanti edildiğinde, REST API'sine sahip olmanın bir çok yararı vardır. Farklı kaygıları tartabilmek ve sisteminiz için doğru yaklaşımı seçebilmek, iyi bir mühendis yapan şeydir.
Ayrıca, REST API bir şeyleri hata ayıklama yoluna giriyorsa, muhtemelen bu resimde yanlış veya eksik bir şey var. Eklenen soyutlama katmanının kendinden hata ayıklamayı zorlaştırdığına inanmıyorum. Büyük, katmanlı sistemler ile çalışırken, dağıtılmış bir günlük kaydı bağlamına sahip olduğumdan emin olmak isterim. Belki bir kullanıcı bir istek başlattığında, bu istek için bir GUID oluşturun ve bu kullanıcının kullanıcı adını ve yaptığı isteği kaydedin. Ardından, uygulamanız diğer sistemlerle konuşurken bu GUID'i iletin. Doğru günlük toplama ve dizine alma ile tüm platformunuzu sorunu bildiren kullanıcı için sorgulayabilir ve tüm işlemlerinde görünürlük kazanabilir ve olayların nerede yanlış gittiğini hızlı bir şekilde tespit etmek için sistemde dolaşabilirsiniz. Yine, daha karmaşık bir mimari
Kaynaklar:
http://alistair.cockburn.us/Hexagonal+architecture
https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing