Komutta doğrulama sonrası hatalar nasıl ele alınır (DDD + CQRS)


18

Bir Kayıt formu göndermek Örneğin, check-in zorunda Domain Model( WriteModeliçinde CQRSgeçerli bir durumda (örneğin, e-posta adresi sözdizimi, yaş, vs) olduğunu).

Sonra a oluşturur Commandve a'ya gönderirsiniz Command Bus.

Komutların hiçbir şey döndürmemesi gerektiğini anlıyorum.

Öyleyse ötesinde bir hatayı nasıl ele alırsınız Command Bus? (Örneğin, bir kullanıcı 1 saniye önce aynı kullanıcıyla kaydoldu username/email).

Bu komutun başarısız olduğunu nereden biliyorsunuz ve hatayı nasıl biliyorsunuz?


2
Etkinlik otobüsüne ihtiyacınız yok. Neden herkes CQRS'yi uygularken bir etkinlik otobüsüne ihtiyacınız olduğunu düşünüyor, bilmiyorum. CQRS, yazımları ve okumaları tamamen ayırmanız, ayrı endişeler yaratmanız anlamına gelir. Bunu yaptığınız sürece CQRS'iniz var. Komutlarınızın eşzamansız olması bile gerekmez. Hata bildirimli senkron komutlar işinize yarıyorsa, bunu yapın.
Andy

1
Komutlar başarılı olduğunda hiçbir şey döndürmemelidir . Fikir , komutun hataya hala bir istisna atabileceği anlamına gelen CQS'den başladı . Açıkladığınız şey tek yönlü bir komuttur. Bununla ilgili olarak bu cevaba bakınız .
Kasey Speakman

Yanıtlar:


4

Komutların hiçbir şey döndürmemesi gerektiğini anlıyorum.

Bu bir görüş, ama tamamen taş değil. HTTP'de yazmaları (PUT, POST, DELETE) düşünün - bu iletilerin tümü, kaynak değiştirme durumunun istenmesini isteyen iletiler oldukları için komutlardır ve yine de yanıtları döndürürler.

Peki Komut Veri Yolu'nun ötesindeki bir hatayı nasıl ele alırsınız? (Örneğin, bir kullanıcı daha önce aynı kullanıcı adı / e-posta ile 1 saniye önce kayıt yaptı).

Bu komutun başarısız olduğunu nereden biliyorsunuz ve hatayı nasıl biliyorsunuz?

Dolayısıyla, komut işleyicisiyle doğrudan iletişim kurduğunuz bir durumda, döndürülen bir mesaj, komutun alındığını ve işlendiğini kabul etmenin mükemmel makul bir yoludur.

Doğrudan hedefle iletişim kurmanızı engelleyen bir otobüs gibi bir ara katman yazılımı kullanıyorsanız, o zaman asenkron mesajlaşma desenlerine bakmanızı öneririm - komut işleyicisine bir mesaj göndermesini nasıl sağlıyorsunuz? arayan?

Bir fikir, komuta sonucuna abone olmaktır; bu Hohpe'nin Kurumsal Entegrasyon Kalıplarındaki bazı fikirlerden ödünç alır. Temel fikir, istemci gönderilen komut mesajına aşina olduğundan, komut mesajının bir sonucu olarak yayınlanan tüm yeni mesajlara abone olmak için iyi konumlandırılmış olmasıdır. Komut işleyici, verileri kayıt defterine kaydettikten sonra, değişikliğin başarılı olduğunu bildiren olayları yayınlar ve istemci bu olaylara abone olur - mesajdaki çeşitli tanımlayıcıların çakışmasını dikkate alarak doğru olayları tanır (nedensel kimlik, korelasyon kimliği vb.).

Alternatif yaklaşımlar biraz daha doğrudan. Mesaj başarılı bir şekilde işlendikten sonra komut işleyici tarafından çağrılabilen bir geri çağırma eklemek olacaktır.

Çok benzer bir alternatif, komut işleyicisinin onay yazması için komut iletisinde yer ayırmaktır - istemci zaten söz konusu komut iletisine sahip olduğundan, devre zaten tamamlanmıştır. " Söz " veya " tamamlanabilir gelecek" düşünün . Mesaj, komut işleyicisine onayı nereye yazacağını söyler; bu, istemciye (geri sayım mandalı) onayın mevcut olduğunu gösterir.

Ve elbette, doğru şeyi basitçe yapma yolunda ilerliyor gibi görünen ara katman yazılımını kaldırma ek seçeneğiniz var.

Örneğin, bir kullanıcı daha önce aynı kullanıcı adı / e-posta ile 1 saniye önce kayıt yaptı

Kullanıcı kaydını kasıtsız olarak gerçekleştiriyorsanız, bir yanıt gözlenene kadar iletilerin yinelenmesi en az bir kez teslim edilmesini sağlamanın yaygın bir yoludur.


2

Örneğin, bir Kayıt formu gönderdiğinizde, Etki Alanı Modelinde (CQRS'de WriteModel) geçerli bir durumda olduğunu (örneğin, e-posta adresi sözdizimi, yaş vb.) Kontrol etmeniz gerekir.

Birçok onaylama türü vardır. E-posta adresi sözdizimi ve yaş biçimini kontrol ettiğinizde doğrulama, bir Komutun yapabileceği bir doğrulama türüdür. Bu gerçekten bir Etki Alanı endişesi değil. Öyle görünebilir çünkü bazı alan uzmanları size bu özellikleri söyleyecektir, ancak Komut oluşturmada bu tür bir doğrulama yapmalısınız. Aslında genel fikir, bir komut oluşturulduktan ve bir BUS'a gönderildikten sonra işlem yapmak daha karmaşık olduğundan, doğrulamayı mümkün olan en kısa sürede yapmaktır.

Peki Komut Veri Yolu'nun ötesindeki bir hatayı nasıl ele alırsınız? (Örneğin, bir kullanıcı daha önce aynı kullanıcı adı / e-posta ile 1 saniye önce kayıt yaptı).

Bu tür bir doğrulama CQRS topluluğunda, CQRS'nin başlangıcından beri çok tartışılmaktadır. Nerede yapmalı? Çok tartışmalı. Şahsen aşağıdaki yaklaşımı kullanıyorum: Komut BUS'a gönderilmeden önce, kullanıcı adını / e-postayı merkezi bir şekilde (yani kullanıcı adı / e-postada benzersiz bir dizin kısıtlaması) alınmış olarak işaretliyorum. Bundan sonra komutu gönderirim. Dezavantajı, komut başarısız olursa, kısa bir süre için kullanıcı adı alınır ve kullanılmaz; bu benim işim için kabul edilebilir, işiniz için muhtemel.

Bu komutun başarısız olduğunu nereden biliyorsunuz ve hatayı nasıl biliyorsunuz?

Bir etki alanı değişmezi nedeniyle Toplama tarafından eşzamansız bir komut reddedilirse, komutun yayıncısını bir şekilde bilgilendiren bazı telafi edici komutlar vererek bazı önlemler alınmalıdır (yani, komutun başarısız olduğunu gösteren bir açıklama e-postası gönderin).

Yinelenen e-posta ile ilgili sorun, e-posta adresi başka bir kişiye ait olduğu için e-posta gönderememeniz, bu yüzden komutu otobüse göndermeden önce kontrol ediyorum.


1

Doğrulama bir dekoratörde yapılmalıdır. Sonra doğrulama gerektiren herhangi bir komut bu şekilde dekore edilebilir.

Geri dönüşünüz, komutunuzla geçersiz kılınmışsa, döndürülen görev sonucu ile senkronizasyon veya zaman uyumsuz çağrılarla alınabilmeleri için istisnalar dışında ele alınabilir.

Başka bir olasılık, onaylamayı bir onay sonucunu geri döndürecek bir tür "sorgu" olarak düşünmektir. Doğrulama sorgusunu çalıştırın ve sonra iletilirse komutu çalıştırın. Bu, dekoratör yaklaşımına bir alternatif olacaktır.


İstisna yaklaşımını seviyorum çünkü en temiz yol bu. Ancak bunun için istisnalar çok ağır değil mi?
EresDev

1
HI @EresDev - Evet, ağırlar. Ancak, verilerinizin ne kadar "geçerli" olduğunu bilmiyorum. Diyelim ki 1000 kayıttan 2'si geçerli değil. Gerçekten istisnai koşullar oldukları için istisnalar uygulanabilir. Şimdi 200 geçerli olmayan 1000 kayıt düşünün. Bu nedenle, verilerinizin% 20'si geçerli olmadığı için evet istisnalarından kaçınılmalıdır. Bu nedenle, mevcut veri geçerliliğinize dayanarak bu yaklaşımı seçip seçmeyeceğinize karar vermeyi size bırakıyorum. :)
Jon Raynor

Buna,% 50 veya daha fazla kullanıcının önce geçersiz veri eklediğini düşündüğüm kayıt formu örneğini saklarsak istisnanın hala iyi olduğunu söyleyerek ekleyeceğim. Web uygulaması arka ucunda, çoğunlukla geçerli veriler alırsınız, çünkü ön uçlar da doğrulama gerçekleştirir. Sadece bir şey nadiren şans eseri ön uç doğrulamasını kaçırmışsa veya biri kandırıyorsa elde edersiniz. Yani, bu durumda istisnalar çok iyidir.
EresDev
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.