DDD - Çok sayıda çocuk içeren toplu kök


10

DDD için nispeten yeni olduğumu söyleyerek bu soruyu önceden yazacağım, bu yüzden burada bazı temel hatalar yapıyor olabilirim!

Hesaplar ve İşlemler (finansal anlamda) kavramlarını içeren bir proje üzerinde çalışıyorum. Bir Hesapta kendisine karşı birçok İşlem girilebilir.

Hesap ve İşlem'in her ikisi de Varlık olduğu ve Hesap olmadan İşlem yapılamayacağından Hesap İşlemleri içeren bir Toplam kök olduğu görülmektedir.

Ancak bu kod uygulamak için geldiğimde hemen bir sorun vurdu. Birçok durumda, bir Hesaptaki her İşlemin bir listesine her zaman sahip olmak benim için özellikle yararlı değildir. Hesap bakiyesini hesaplamak ve kredi limiti gibi değişmezleri zorlamak gibi şeyler yapabilmekle ilgileniyorum, ancak aynı zamanda İşlemlerin bir alt kümesiyle (örneğin bir tarih aralığına girenleri görüntülemek) kolayca çalışabilmek istiyorum.

İkinci durumda, bir (eğer TransactionRepositoryçok büyük) listeyi yüklemeden sadece ihtiyacım olan nesnelere verimli bir şekilde erişebiliyordum. Ancak bu, Hesap dışındaki şeylerin İşlemlerle çalışmasına izin verir, bu da Hesap kavramını toplu kök olarak bozduğum anlamına gelir.

İnsanlar bu tür bir durumu nasıl ele alıyor? Sadece çok sayıda çocuğa bir toplu kök için yüklenmenin bellek ve performans sonuçlarını kabul ediyor musunuz?

Yanıtlar:


9

"Olmadan var olamaz" kuralına dikkat etmenizi tavsiye ederim . Bu, UML / OO tasarımındaki kompozisyon kavramından bahseder ve orijinal DDD mavi kitapta Agregat tasarımı için öngörülen yaklaşımlardan biri olabilir (bundan emin değilim), ancak o zamandan beri büyük ölçüde revize edilmiştir. Toplamalarınızı işlem tutarlılığı sınır perspektifinden görmek daha iyi bir fikir olabilir .

Fikir, kümelerinizi ne kadar büyük, ne de işaret ettiğiniz gibi performans sorunlarınız olacak kadar büyük yapmamaktır, çünkü bazı değişmezler kaçınılmaz olarak birden fazla kümeye yayılır ve bu da toplam kilitleme ve eşzamanlılık sorunlarına neden olur.

Doğru toplam boyutu, belirli bir ticari işlemde değiştirdiğiniz şeylerin konturlarıyla ideal olarak eşleşir, daha fazla ve daha az değil. Örneğinizde, birden fazla finansal işlemi kapsayan çok sayıda alan adı değişmezi yoksa Transaction, kendi başına bir Toplu Kök yapmak en iyi çözüm olabilir.


Teşekkür ederim, tutarlılık sınırlarını okuyacağım. İşlemi kendi toplam kökü yapma öneriniz iyi olabilir; Dediğiniz gibi, birden fazla işlemi kapsayan çok fazla değişmezim yok.
krixon

7

tl; dr - gerekiyorsa kuralları çiğneyin. DDD tüm sorunları çözemez; aslında verdiği nesne fikirleri iyi tavsiye ve iyi bir başlangıç, ancak bazı iş sorunları için gerçekten kötü seçimlerdir. Bir şeyin nasıl yapılacağına dair bir ipucu olarak düşünün.


Tüm çocukları (işlem) ebeveynle (hesap) yükleme sorunu için - Birçok ORM'nin çözdüğü n + 1 sorununda (google'a bir şey) karşılaştığınız anlaşılıyor.

Çocukları tembel yükleyerek (işlem) - sadece gerektiğinde çözebilirsiniz.

Ama zaten bildiğiniz gibi sesler, sorunu çözmek için bir TransactionRepository kullanabileceğinizi söyleyerek.

Bu verileri yalnızca Hesap'ın kullanabilmesi için 'gizlemek' için, herkese açık bir ilişkisel tablo gibi, başkalarının nasıl serileştirilmeyeceği bir yerde saklamanız gerekmez. Bir belge DB'sinde hesabın 'belge' ile depolanmasını sağlayabilirsiniz. Her iki durumda da birileri yeterince denerse, verileri hala görebiliyordu. Ve onunla 'çalış'. Ve bakmadığın zaman, yapacaklar!

Böylece izinler ayarlayabilirsiniz, ancak daha sonra, 'hesap'ı ayrı bir işlem olarak çalıştırmanız gerekir.

Burada gerçekten fark ettiğiniz şey, DDD'nin ve nesne modelinin saf kullanımının bazen sizi bir köşeye geri getireceğidir. Doğrusu, elbette, DDD'nin tasarım ilkelerinden yararlanmak için 'kompozisyon' / agrega kökü kullanmak zorunda değilsiniz. Kısıtlamalarına uyan bir durum olduğunda kullanabileceğiniz sadece bir şey.

Birisi 'erken optimizasyon yapma' diyebilir. Ancak bu durumda, cevabı biliyorsunuz - hepsini sonsuza kadar hesapla tutacak bir yöntemi bozmak için yeterli işlem olacak.

Asıl cevap SOA'yı ayağa kalkmaya başlamak. İşyerimde Udi Dahan 'Dağıtılmış bilgi işlem' videolarını izledik ve nServiceBus'u satın aldık (sadece bizim tercihimiz). Hesaplar için bir hizmet yapın - kendi işlemi, mesaj kuyrukları, yalnızca görebildiği bir ilişki veritabanına erişim ve ... viola, programdaki SQL ifadelerini kodlayabilir ve hatta birkaç Cobol işlem komut dosyası (şaka) atabilirsiniz ancak ciddi olarak endişelerin en akıllı OO / Java züppesinin hayal edebileceğinden daha fazla ayrılması.

Yine de iyi modelleme tavsiye ederim; hizmeti mini sınırlı bir sayı olarak ele alarak sorunsuz bir şekilde burada toplam kökün avantajlarına sahip olabilirsiniz.

Elbette bunun bir dezavantajı var. Hizmetlerin içinde ve dışında sadece RPC'yi (webservice, SOAP veya REST) ​​ve aralarında veya geçici bağlantı nedeniyle 'düğüm' adı verilen bir SOA antipattern'i elde edemezsiniz. Olay düzenleyicileri ve olay yükselticileri gibi, ancak (1) süreçler arasında (biri aşırı yükleniyorsa ayrı makinelere koyabileceğiniz) iletişim düzeni, yani 'Pub-Sub' in tersini kullanmalısınız.

asıl mesele, 'engellemek' veya beklemek için başka bir hizmetten veri alması gereken bir hizmet istemiyorsunuz - mesajı ateşlemeniz ve unutmanız ve programınızın başka bir yerindeki bir işleyicinin işlemi tamamlamak için alması gerekiyor. Bu, mantığınızı farklı yapmanız gerektiği anlamına gelir. nServicebus, bunlara yardımcı olmak için 'destan' desenini otomatikleştirir, ancak sonunda farklı bir kodlama stili geliştirmeniz gerekir. Her şeyi hala yapabilirsiniz, sadece farklı yapmak zorundasınız!

Arnon Rotem-Gal-Oz'un "SOA Patterns" kitabı bu konuda birçok soruyu yanıtlıyor. İhtiyaç duyulduğunda dışarıdaki servislerden verileri kendinize periyodik olarak çoğaltmak için 'aktif hizmet kalıbı' kullanımını da dahil etmek (birçok RPC gerekli olurdu veya yayınlama / abone olma ekosisteminde bağlantı güvenilir değil / değil).

Sadece önizleme için, UI yok hizmetlerine RPC gerekiyor. Raporlar, hizmetlerin veritabanları tarafından beslenen bir raporlama veritabanından oluşturulur. Bazı insanlar raporlara ihtiyaç olmadığını ve sorunun başka bir şekilde çözülmesi gerektiğini söylüyor. Bu konuşma hakkında şüpheci olun.

Sonunda, her şey düzgün bir şekilde tek bir hizmette sınıflandırılamaz. Dünya mantı koduyla koşmuyor! Yani kuralları çiğnemek zorunda kalacaksınız. Asla zorunda kalmasanız bile, projeye yeni geliştiriciler bunu terk ettiğinizde yapacaklardır. Ancak endişelenmeyin, elinizden geleni yaparsanız, kuralları takip eden% 85'i çok daha sürdürülebilir bir program yapar.

Vay be, çok uzundu.


Ayrıntılı yanıt için teşekkürler, kesinlikle SOA hakkında biraz okuma yapacağım.
krixon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.