Bir komut veya olay kullanmalı mıyım?


14

Bir komuta ve otobüs iletişimindeki bir olay arasındaki fark bana biraz belirsiz geliyor. Bir olay birden çok kez işlenirken komutların yalnızca bir kez yürütülmesi gerektiğini biliyorum, ancak ne zaman bir komut veya olay kullanacağımdan emin değilim.

Bir örneğe bakalım:

Yeni bir kullanıcı bir web uygulamasına kaydolduğunda, ona bir hesap oluşturmalı ve bir onay e-postası göndermeliyiz.

Hesap oluşturma - bu CreateUserCommand, otobüse a göndermek ve özel bir bileşenin işlemesini sağlamak için doğru nokta gibi görünüyor .

Ya da belki de bu zaman uyumsuz bir veri yolu iletişimi ile uygulanmamalıdır? Kullanıcının hemen uygulamaya giriş yapabilmesini istiyoruz. Veriyolu ile komutun ne zaman yürütüleceğini garanti etmiyoruz.

E-posta gönderme - bileşen hesabı oluşturduktan sonra 2 olasılık görebiliyorum

  1. Otobüse başka bir komut gönder SendConfirmationEmailCommand
  2. Etkinlik yayınlama UserAccountCreatedEvent

Ve e-posta gönderen bileşeninin onu ve işini almasına izin verin.

Bir yandan onay e-postasının yalnızca bir kez gönderilmesini istiyorum (bir komut kullanın), diğer yandan yeni kayıtlı kullanıcılarla ilgilenen birden fazla bileşen olabileceğine inanıyorum. Bir kaydedici veya belki bir SMS göndericisi.

Nasıl uygularsınız?

Yanıtlar:


16

Prensip olarak, bir komut yürütülecek bir isteği açıklarken, bir olay gerçekleşen bir şeyi açıklar:

  • Komut, bir işlemci tarafından bazı eylemlerin gerçekleştirilmesini gerektirir ve bu eylem, bu işlemci tarafından yalnızca bir kez gerçekleştirilmelidir.

  • Olay, halihazırda yürütülen bazı eylemlerin veya harici bir durumun bildirilmesidir. Birkaç işlemci / ajan olay hakkında bilgi edinmek isteyebilir. Bunların birçoğu, bu bildirim tarafından sorumluluk alanlarında gerekli olan komutları veya eylemleri de yayınlayabilir.

Senaryonuzda şunu anlıyorum:

  • CreateUserCommand bir komut
  • UserAccountCreatedEventCreateUserCommandhesap yönetimi hizmeti tarafından başarıyla tamamlandığında yapılması gereken bir etkinliktir

Şimdi iki olasılık var:

  1. SendConfirmationEmailCommandBu komutun daha özel bir hizmet tarafından yürütülmesini beklediği için hesap yönetimi hizmeti kendi kendine veri yolunda bir sorun çıkarır .
  2. Hesap yönetimi hizmeti, etkinlik bildirimini tamamlandığında göndermekten başka bir şey yapmaz ve başka bir hizmete (örneğin iletişim hizmeti, abonelik hizmeti vb.) E-posta / sms / vb. SendConfirmationEmailCommandbazı ağ geçitleri tarafından gerçekleştirilecek bir komut vermek için gereklidir.

Bir servis yolu yaklaşımını tercih ettiyseniz, bunun izin verdiği esnekliği kullanmak mantıklı olacaktır, yani 2. seçeneği tercih etmek.


Teşekkürler, bu her şeyi temizler. Seçenek 2 hakkında iki soru daha: 1. Hesap yönetimi hizmeti komutun tamamlandığını nasıl bilecek? Görevlerinin tamamlanması üzerine uzman servisler tarafından yayınlanan olayları dinleyerek hesap yönetimi hizmetinin asıl amacının ne olduğuna inanıyorum. Olayları yeniden yayınlamak için? Gereksiz görünüyor. 2. Ayrıca SendConfirmationEmailCommand'ı kimin yayınlaması gerektiğini de anlamadım. Hesap yönetimi hizmeti mi yoksa "başka bir hizmet" mi?
Andrzej Gis

1) varsayımım, hesap yönetimi hizmetinin işi tamamlaması ve başarıyla tamamlandığında etkinliği göndermesidir (yani herhangi bir hatayla karşılaşılmadı). Ancak haklısınız: hesap yönetimi hizmetinin kendisini bir kalıcılık / veritabanı hizmetine komutlar göndermesi ve iş tamamlama olayını izlemesi (örneğin zaman uyumsuz bir yanıt) mümkündür.
Christophe

@gisek 2) bir servis otobüsünde, her biri sınırlı bir sorumluluğa sahip olan çok özel hizmetlerin olduğunu hayal ediyorum. Bu durumda Hesap Yönetimi yalnızca oluşturma işlemini gerçekleştirir ve kimin ilgilendiğini bildirir. Başka bir hizmet daha sonra tepki gösterecek şeyleri izlerdi. Örneğin, etkinliklerin kullanıcılara ne zaman ve nasıl iletileceğine karar vermek için iş kurallarını uygulamakla görevli bir iletişim yöneticiniz olabilir. Aynı hizmette 1) +2) yaparsanız, bir servis veriyoluna ihtiyacınız yoktur.
Christophe
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.