Giriş Giriş Giriş
Model-View-Controller (MVC) modeli, on yıllardır web uygulama geliştirmenin temel taşı olmuştur. Ancak, uygulamalar karmaşıklıkta büyür ve kullanıcı talepleri artarken, birçok takım modellerini keşfeder - veri ve iş mantığından sorumlu katmanlar -özellikle şişe darbesine yol açan modeller, tekrarlanan mantıka ve bir kod tabanına yol açar.
MVC Desenlerini Anlayın
MVC modeli, üç birbirine bağlı bileşene bir uygulama ayırır:
- [FONT:0) Model:[Döneticileri, iş kuralları ve kalıcı mantık. Uygulamanın domaini için tek gerçek kaynağı.
- [FONT:0)View:[DÜDÜT:1] Kullanıcı arayüzünü kopyalar, genellikle modelden verileri okuyarak (veya bunun sunum odaklı bir gösterimi).
- [FONT:0)Denetler:[[Dönetici:[Dönetici:0) Kullanıcı girişi, model ve görüş arasındaki orkestralar etkileşimleri ve durumu uygun şekilde günceller.
Bakış ve kontrol önemlidirken, model entelektüel karmaşıklığın çoğunun yaşadığı yerdir. İyi yapılandırılmış bir model, uygulamanın yeni gereksinimlerine uyum sağlamasına, artan trafikle başa çıkmalarına ve birden fazla arayüze (örneğin, web, API, mobil) katlanma değişiklikleri olmadan destekleyebilmelerini sağlar.
Scalable Modelleri için Temel Prensipleri
Belirli desenlere dalmadan önce, birkaç temel ilkeyi içselleştirmek önemlidir:
- [FONT:0) Tek Sorumluluk:[Dönetici:[Dönetici:0) Her model veya sınıf, iş doğrulamadan ayrı bir sebep olmalıdır.
- [FONT:0) · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
- [DRY:0) Kendinizi tekrar etme (DRY): ), birden fazla modelde veya kontrolörlerdeki mantığın bakım kabuslarına yol açar. Bunun yerine, kullanılabilir hizmetler veya özellikler içine ortak davranışları çıkarın.
- [FONT:0)Dependency Invers:[Döneticileri 1) Yüksek seviyeli modüller soyutlamaya (interfaces) bağlı olmalıdır. Bu, veritabanını, kalibrasyon sağlayıcıları veya dış hizmetleri yeniden yazma iş mantığı olmadan değiştirme sağlar.
Domain-Driven Design (DDDD)
Eric Evans'ın Domain-Driven Design, ölçeklenebilirliği modellemenin en etkili yaklaşımlarından biri olmaya devam ediyor. DDD, geliştiricilerin temel iş alanlarının teknik kaygılardan ziyade model düzenlemelerini teşvik ediyor.
Ubiquitous Language
Geliştiriciler, alan uzmanları ve paydaşları tarafından paylaşılan ortak bir kelime oluşturun. Aynı terimleri kod, dokümantasyon ve konuşmalarda kullanın. Örneğin, bir e-ticaret uygulaması gerçek dünya düzeni davranışını yansıtan bir sınıf olmalıdır, genel birTELFLT:1 değil.
Bounded Contexts
Büyük uygulamalar birden fazla alt alandan oluşur. DDD, bağlamlar arasındaki açık sınırları tanımlamayı önerir - örneğin, sipariş yönetimi, envanter ve nakliye için ayrı modeller. Her bir sınırlı bağlamda, modeller, sınırların içindeki bu özel alan için optimize edilebilir.Bu izolasyon, ölçeklendirme geliştirme ekipleri için bağımsız olarak önemlidir.
Aggregates
Bir arsa tek bir birim olarak tedavi edilen alan nesnelerin bir kümesidir. Örneğin, anİLFLT:2) agrembad4'ü dahil edebilir ve tüm sipariş kökünü azaltır.Bu model karmaşık ilişkileri azaltır ve işlemleri basitleştirir.
Daha derin bir dalış için, [[0.Martin Fowler'in DDD'ye girişine atıfta bulun).
Katmanlı Mimari
Bir tabakalı mimari, modeli farklı mantıksal tierslere organize ederek daha fazla endişe eder:
- [FONT:0]Domain Katmanı:[Döneticileri, değer nesneleri ve domain hizmetleri. Bu katman altyapıya bağlı değildir.
- [FONT=0) Uygulama Katmanı:[Döneticiler vakaları kullanıyor, koordinatlar domain nesneleri ve işlemleri yönetiyor. Bu, alan katmanına bağlıdır.
- [FONT:0)Infra structure Katman:[Dönetici:[Dönetici:[Dönetici:0) Implements ısrar, mesajlaşma, dış API çağrıları ve diğer teknik endişeler.
- [[Düzg:0)Öyleleme Katmanı:[Dönetici:[Dönetici:0)[Dönetici:[Dönetici:[Dönetici: · 1 )
Bu ayrılık, veritabanı teknolojisine, kalibrasyon stratejisine veya UI çerçevesine yapılan değişikliklerin temel iş mantığından ayrılamayacağı anlamına gelir. Ayrıca ünite testlerini daha kolay hale getirir - domain mantığı veritabanına karşı test edilemez.
Repositories ve Hizmetler
İki desen özellikle modeller temiz ve ölçeklenebilir tutmak için değerlidir:
Repository Desen
Bir repository veri erişim mantığını oluşturur, bir in-memory koleksiyonu benzeri arayüzü alan nesnelere sağlar.Sekizleyiciler boyunca veritabanı sorguları yerine, bu soyutlama veri kaynağını (örneğin, PNG'dan PostgreSQL veya hatta test için bir in-memory mağazası) en az etki ile takas etmenizi sağlar.
Servis Katmanı
Hizmetler doğal olarak tek bir varlıka ait olmayan iş mantığı içerir. Örneğin, anİLFLT:6), bir sipariş verirken geçerliliği, fiyatlandırmayı ve envanter kontrollerini koordine edebilir. Hizmetler depolayıcılara ve alan varlıklara bağlıdır, ancak veritabanına göre yeniden kullanılabilir.
Daha fazla okuma için, bkz.D:0)Fowler'in Repository deseni açıklaması).
Data Transfer Objects (DTOs) ve View Models
Tüm domain modelinizi manzara katmanına veya dış API müşterilerine aktarmak, sıkı bir darbe yaratır ve genellikle gereksiz iç ayrıntıları ortaya çıkarır. Bunun yerine, DTO'ları tam olarak gerekli olan verileri şekillendirmek için kullanır.
- [[Düzücü:0)Decoupling:[Döneticileri için değişiklikler otomatik olarak API müşterileri kırmaz.
- [FONT=0) Güvenlik: [Döneticiler:[Döneticiler, iç kimlikler, denetim süreleritampler) ihmal edilebilir.
- [FONT:0)Performance:[Döneticiler, belirli bir uç noktası tarafından gerekli alanları, ücret yükünü azaltmak için uygun olabilir.
View models, yalnızca görüntünün formatlanmış tarihler veya toplamlar gibi görüntü mantığının (örneğin görüntülenmesi gereken verileri içeren sunum katmanı için benzer bir amaç sunar).
Optimizing Database Access for Scalability
En temiz model mimarisi bile veritabanı erişimi verimli olup başarısız olacaktır. Anahtar stratejileri şunlardır:
Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing Indexing
Analiz ve sütunlarda indeksler oluşturmak, [[BİLMİNCİZEMELER İZMİRT:8) ve [[FONTFLT:9) Maddeler. Over-indexing yavaş yazar, bu yüzden ölçüm ve monitörler.
Sorgu Caching
Redis veya Memcached gibi mağazaları pahalı sorguların sonuçlarını önbelleklemek için kullanın. Domaininiz için uygun önbellekli, etkinlik odaklı veya manuel olarak).
Pagination ve Lazy Yükleniyor
Asla bellekte büyük veri kümelerini yükleyin.Köpektif veya dengeleme paginasyon kullanın. ORMs'de çocuk ilişkileri için tembel yükleme etkinleştirin, ancak N + sorgu problemlerinden dikkatli olun - gerektiğinde, istekli yükleme kullanın (örneğin, ActiveRecord veyaFLT:10).
Lazy Yükleniyor vs Eager Yükleniyor
Doğru yükleme stratejisini seçmek performans için kritik:
- [[Dönetici:0)Lazy Yükleniyor:[Dönetici:[Dönetici:0) İlgili veriler yalnızca erişimli olduğunda yüklenir. Bu, tek kişilik operasyonları için verimlidir, ancak döngülerde degrad performansına sahiptir (N+1 problem).
- [FONT:0)Eager Yükleniyor:[Dönetici:[Dönetici:0)Tek bir sorguda gerekli tüm ilişkileri tek bir sorguda tut. Görüş veya hizmetin ilgili verilere ihtiyaç duyacağınızda kullanın.
Bilişsel bir yaklaşım, bilinen yollar için istekli yüklemeye ve sadece nadiren erişimli dernekler için tembel yüklemeye varsayılan olmaktır. Doğru dengeyi bulmak için veritabanı sorgularınızı gerçekçi yük altında kullanın.
Yatay Scaling için planlama
Uygulamanız tek bir sunucunun ötesine geçtiğinde, model katmanı dağıtımını desteklemelidir:
- [FONT:0]Stateless Modeller:[Dönetici:[Dönetici:0) Kullanıcı seansını veya istekte belirli verileri modellemekten kaçının.Demoksuz hizmetler sağlamak için enjeksiyonu kullanın.
- [FONT:0]Efficient Seriizasyon:[Dönetici:[Dönetici: 0,4:0) Ağ boyunca seyahat edecek modeller (örneğin JSON API aracılığıyla) hızlı serileştirme / dizileme için tasarlanmıştır. DTO'lar, karmaşık nesne grafiklerle dairesel referanslarla kullanmalıdır.
- [FONT=0)Database Sharding:[Dönetici için, birden fazla veritabanına karşı bölüm verileri.You repository katmanınız, toplayıcı köke dayanan bir strateji ile soyutlamalı.
- [FONT:0] Sürekli Konsolidasyon:[Dönetici:[Dönetici:0) Dağılı sistemlerde, hizmetteki kaynakları kilitleyen dağıtılmış işlemlerden kaçının. yerine, olay ve mesaj kuyrukları gibi olay temelli tutarlılığı kucaklayın.
Ek En İyi Uygulamalar
Bağlanma Enjeksiyonuna bağlı
Yedek ve hizmet bağımlılıklarını çözmek için bağımlılık enjeksiyon konteynerini kullanın. Bu de çift modeli beton uygulamaları ile inşa eder ve test veya ölçeklendirme için bileşenleri takas etmeye karar verir.
Immutability
Mümkün olduğunda, tasarım değeri nesnelere asmutable. bir immutableETHFLT:12) sınıf, aliasing ve koncurrency ile ilgili böcekleri azaltır. Ek olarak, taklit ve önbellekleme modelleri test etmek daha kolaydır.
Test in Isolation
Servisler ve alan mantığı için birim testleri bir veritabanı veya çerçeve çizme gerektirmez. Boş havuzu kullanın.Integral uygulamaları veya in-memory uygulamaları. bütünleme testleri gerçek bir veritabanına karşı kalıcı davranışı doğrulayabilir, ancak onları hedefle tutmalıdır.
Anti-Corruption Katmanı
Geleneksel sistemler veya dış API'ler ile bütünleşmek, modeliniz ve dış sistem modeliniz arasındaki çevirileri tercüme eden bir anti-korruption katmanı inşa etmek.Bu, bölgenize sızdıran dış değişiklikleri önler.
Dokümantasyon ve Kod Yorumları
Model yapıları genellikle zaman içinde tıkanır hale gelir. Mimarlık karar kayıtları (ADRs) ve kod incelemeleri yoluyla tutarlılığı uygular. Yeni ekip üyeleri veya bir modül ay sonra tekrarlarken iyi belgelenmiş bir model ödemeleri karları öder.
Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç
MVC modellerinde ölçeklenebilirlik için modeller bir zaman tasarım egzersizi değil, devam eden bir disiplindir.Rezersiz yükleme stratejisi gibi ilkelere atıfta bulunarak, DD ve tabakalı mimariye başvurmak ve her mimari kararının ticari-offları içerdiğini unutmayın - pragmatik, ölçümler ve iterate.
Daha fazla araştırma için, incelikli çalışma şekline bakınız:0)Evans' Domain-Driven Design kitabı[Dönetici:2) ve [[Döncük kalıpları[Döneticiler 3 ).Bu kaynaklar burada tartışılan desenlere daha derin bir fikir sağlar.