Bir garip kalıp tespit edildiğinde kullanıcıları e-posta ile uyaran bir finansal uygulama için küçük bir güvenlik alt sistemi uygulamak istediğimizi varsayalım. Bu örnekte, desen tasvir edildiği gibi üç işlemden oluşacaktır. Güvenlik alt sistemi ana sistemdeki olayları bir kuyruktan okuyabilir.
Almak istediğim, modelin mevcut durumunu modelleyen bir ara temsil olmaksızın, sistemde meydana gelen olayların doğrudan bir sonucu olan bir uyarıdır.
- İzleme etkinleştirildi
- İşlem gerçekleştirildi
- İşlem gerçekleştirildi
- İşlem gerçekleştirildi
- Uyarı tetiklendi (id: 123)
- Gönderilen uyarı için e-posta (kimlik için: 123)
- İşlem gerçekleştirildi
Bunu göz önünde bulundurarak, net bir cevabı olmayan bir sorum olsa da, olay kaynaklarının burada çok iyi uygulanabileceğini düşündüm. Örnekte tetiklenen uyarının net bir yan etkisi vardır, bir e-postanın gönderilmesi gerekir, bu sadece bir kez gerçekleşmesi gereken bir durumdur. Bu nedenle, bir agreganın tüm olaylarını tekrar oynatırken gerçekleşmemelidir.
Bir dereceye kadar, CQRS / Olay kaynak literatüründe pek çok kez gördüğüm sorgu tarafının oluşturduğu materyalizasyonlara benzer şekilde gönderilmesi gereken e-postayı, o kadar ince olmayan bir farkla görüyorum.
Bu literatürde, sorgu tarafı, tüm olayları tekrar okuyarak belirli bir noktada durumun gerçekleşmesini sağlayabilen olay işleyicilerinden oluşturulmuştur. Ancak bu durumda, bu daha önce açıklanan nedenlerle tam olarak aynı şekilde gerçekleştirilemez. Her devletin geçici olduğu fikri burada pek de geçerli değil . Bir yere bir uyarı gönderildiğini kaydetmemiz gerekiyor.
Benim için kolay bir çözüm, daha önce tetiklenen uyarıların kayıtlarını tuttuğunuz farklı bir tablo veya yapıya sahip olmak olurdu. Bir kimliğimiz olduğu için, aynı kimliğe sahip bir uyarının daha önce yayınlanıp yayınlanmadığını kontrol edebiliriz. Bu bilgilere sahip olmak SendAlertCommand idempotent yapar. Birkaç komut verilebilir, ancak yan etki sadece bir kez olur.
Bu çözümü göz önünde bulundursak bile, bunun bu mimaride bu sorun için bir sorun olup olmadığını gösteren bir ipucu olup olmadığını bilmiyorum.
- Yaklaşımım doğru mu?
- Bununla ilgili daha fazla bilgi bulabileceğim bir yer var mı?
Bununla ilgili daha fazla bilgi bulamadığım garip. Belki de yanlış ifadeler kullanıyorum.
Çok teşekkür ederim!