CQRS'de yeni toplu kök nasıl oluşturulur?


10

CQRS mimarisinde nasıl yeni agrega kökleri oluşturmalıyız? Bu örnekte, ilk AR1'e başvuruda bulunan yeni bir toplam kök AR2 oluşturmak istiyorum.

Başlangıç ​​noktası olarak AR1 yöntemini kullanarak AR2 oluşturuyorum. Şimdiye kadar birkaç seçenek görüyorum:

  1. AR1 içinde iç yöntem createAr2RootOpt1çağırabilir new AR2()ve depoya erişim olan etki alanı hizmetini kullanarak db imediatelly için bu nesneyi kaydedebilirsiniz.
  2. Ben ilk toplama kökü örneğin olay yayabilir. SholdCreateAR2Eventve sonra buna tepki veren ve CreateAR2Commanddaha sonra işlenen ve aslında AR2 oluşturan ve yayan komut veren durumsuz destanlara sahip olun AR2CreatedEvent. Olay kaynağının kullanılması durumunda SholdCreateAR2Event, ilk toplama kökü durumunu etkilemediğinden olay deposunda korunmaz. (Yoksa bunu yine de etkinlik deposuna mı kaydetmeliyiz?)

    class AR1{
        Integer id;
        DomainService ds;
    
        //OPTION 1
        void createAr2RootOpt1(){
            AR2 ar2 = new AR2();
            ds.saveToRepo(ar2);
        }
    
        //OPTION 2
        void createAr2RootOpt2(){
            publishEvent(new SholdCreateAR2Event());    //we don't need this event. Shoud it still be preserved in event store?
        }
    }
    
    class AR2{
        Integer id;
        Integer ar1Id;
    
        void handle(CreateAR2Command command){
            //init this AR with values and save
            publishEvent(AR2CreatedEvent());    //used for projections afterwards and saved inside AR2 event store
        }
    }
    
    class Saga{
        void handle(SholdCreateAR2Event ev){
            emitCommand(new CreateAR2Command());
        }
    }
    

Bunu yapmanın daha uygun yolu hangisidir?

Yanıtlar:


2

Bence bu seçenek yok. 2, küçük ama önemli bir değişiklikle çözümdür: AR1bir olayı yaymamalı, amacı yaratmak için değil AR2, bir AR1WasCreatedolayı yaymalıdır . Bu olay, doğum deposunu işaretleyen önemli bir olay olduğundan etkinlik deposunda devam etmelidir AR1. Sonra, bir Sagawhould için listent AR1WasCreatedolayı ve oluşturmak için bir komut oluşturmak AR2: CreateAR2Command.

Seçenek 1 çok yanlış. Bu tür bir alan adı hizmetini hiçbir zaman bir Aggregate. Aggregatessaf olmalı, olayların üretilmesinden başka hiçbir yan etkisi yoktur.

Not Aggregate: Bir nesnenin bir örneğini (programlama dili anlamında) oluşturma ile bir nesnenin oluşturulması (isterseniz doğum) arasında bir ayrım olduğu için , yapıcıdan hiçbir zaman olayları yayınlamam Aggregate. Olayları yalnızca bir handleyöntemden (a kullanırken) yayarım command.


Ne demek istiyorsun AR1WasCreated? Olmalı mı AR2WasCreated? Ayrıca, mantığınızı kullanırsam AR2WasCreated, gerçekte oluşturulmadan önce olay yayarım ? Ve bu olayı AR1'in olay günlüğüne kaydetmek sorunlu görünüyor, çünkü aslında bu verilere AR1 içinde ihtiyacım yok (AR1 içindeki hiçbir şeyi değiştirmiyor).
Bojan Vukasovic

Tamam, 3 yıl sonra. O gider AR1WasCreated-> SAGA (A1 sonra A2 oluşturmak oluşturulmuşsa kuralı vardır) -> CreateAR2Command-> AR2WasCreated.
Bojan Vukasovic

@BojanVukasovic Yazdığım gibi çalıştığına sevindim :)
Constantin Galbenu

2

CQRS mimarisinde nasıl yeni agrega kökleri oluşturmalıyız?

Yaratılış kalıpları tuhaf .

Udi Dahan'ın genel sorun hakkında söyleyecek bazı yararlı noktaları var: Agrega Kökleri Oluşturma . Temel nokta, toplamın sadece hiçbir yerden çıkmaması ve nasıl göründüklerini açıklayan alan adı dilinin olması ve alan modelinizde yakalanması gerektiğidir.

Bükülmeye meyilli olduğu yer, etki alanı modelinizde komutu işleyen varlığın işlem tarafından değiştirilen varlık olmamasıdır . Bu yanlış değil; sadece garip (bir kurumdan kendini değiştirmesini istediğin durumlara kıyasla).

İkinci yaklaşımınız da iyi. "Veritabanına gerçekten kaydetmeden yükselttiğimiz etkinlikler" bazen "alan etkinlikleri" olarak adlandırılır

Temel fikir, aynı işlem içinde, komut işleyicisinin, veri yolu boyunca ikinci toplayıcının kendisini oluşturmasına izin veren bir olay işleyicisine giden olayı yükseltmesidir. Belki biraz daha iyi kod uyumu elde edersiniz.

Not: olay kaynaklı sistemlerde, olayları genellikle bu şekilde kullanmazsınız.

Olay kaynağı kullanması durumunda, ilk toplama kökü durumunu etkilemediğinden, olay deposunda ShouldCreateAR2Event korunmaz.

Not: olay adları genellikle geçmiş zamanda - ShouldCrateAR2 yanlış yazım denetimi yapar.

Evet, uzaktan kodu çalıştırmak için senkronize veriyoluna bir olay atıyorsanız, o olayı kayıt defterine kaydetmemelisiniz. Bu ölçekte sadece bir uygulama detayı.

Yoksa bunu yine de etkinlik deposuna mı kaydetmeliyiz?

Aynı işlemde iki farklı olay akışını değiştirmekten kaçının. Bu oluşturma da AR1'deki bir değişikliği temsil ediyorsa, normal yanıt bu işlemdeki AR1'i değiştirmek ve AR2 oluşturma komutunu başlatmaktan sorumlu olan olaylara eşzamansız bir abone olacaktır.

İdempotent komut kullanımı burada çok yardımcı olur.


cevap için teşekkürler. % 100 net olmayan bir şey daha - daha sonra AR2 için AR2 argümanı olarak kullanmak zorunda kalırsam bunu nasıl geçmeliyim - CQRS AR'nin sadece yazma ve sorgulama için kullanılması gerektiğini belirtiyor. Ancak, AR1.doSmthn(AR2 param)oluşturduğum herhangi bir okuma projeksiyonunda ihtiyacım olan tam veri olmadığından (yalnızca AR2'nin tam verileri var) kullandığımdan başka bir seçeneğim yok.
Bojan Vukasovic

> "Evet, uzaktan kod çalıştırmak için senkronize veriyoluna bir olay atıyorsanız, o olayı kayıt defterine kaydetmemelisiniz." Bence tasarruf etmenin gerçek bir değeri var, çünkü bir şeyin gerçekleşmesi için sürecin başlatıldığını biliyorsunuz, şimdi bunun gerçekten tamamlanıp tamamlanmadığını da izleyebilirsiniz. Ama sanırım kullanım durumuna bağlı
Chaosekie
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.