Je souhaite développer un microservice Emailer
qui fournit une commande SendEmail
. A l'intérieur du Microservice J'ai un agrégat à l'esprit ce qui représente l'ensemble du processus e-mail avec les événements suivants:Source d'événements combinée avec des données effaçables
Aggregate Email
:
- (
EmailCreated
) EmailDeliveryStarted
EmailDeliveryFailed
EmailRecipientDelivered
quand on des destinataires a reçu l'e-mailEmailRecipientDeliveryFailed
lorsque l'un des destinataires ne pouvaient pas recevoir le courrier électronique- etc.
En arrière-plan du service de distribution de courrier SendGrid est utilisé; mon microservice fonctionne comme une façade pour cela avec mes propres événements. Les webhooks entrants de SendGrid sont traduits en événements de domaine appropriés.
Le processus ressemblerait à ceci:
Commande
SendEmail
==>EmailCreated
EmailCreatedHandler
==> E-mail.Send
(à SendGrid)webhook entrant ==>
EmailDeliveryStarted
- D'autres webhooks ==>
EmailRecipientDelivered
,EmailRecipientDeliveryFailed
, etc.
Bien sûr, si je veux remplacer le webservice externe et cela s'appliquerait à d'autres stratégies de messagerie que je m'adapterais à cela mais garderais mon modèle de domaine avec ses événements. Je veux laisser le client ne pas s'inquiéter de la stratégie concrète de livraison d'email. Maintenant, le problème crucial auquel je suis confronté: Je veux accepter les commandes SendEmail
même si SendGrid n'est pas disponible à ce moment-là, ce qui implique de stocker l'ensemble des données de courrier électronique (avec pièces jointes) puis, avec un gestionnaire d'événements, processus d'envoi. D'un autre côté, je ne veux pas gonfler mon événement initial EmailCreated
avec ces données BLOB. Et je veux être en mesure de nettoyer ces données après que SendGrid a accepté ma demande d'envoi d'e-mail.
Je pourrais aussi essayer d'envoyer l'email à SendGrid et de stocker un événement initial EmailDeliveryStarted
dans la commande SendEmail
. Mais cela ressemble à un commit en deux phases: si SendGrid acceptait mon appel mais que mon référentiel était incapable de stocker l'événement EmailDeliveryStarted
, le client serait informé que quelque chose se passait mal et il essaye à nouveau ce qui serait un désastre.
Donc je ne sais pas comment concevoir mon agrégat et, plus important, mon événement EmailCreated
car il ne devrait pas contenir les données BLOB comme les pièces jointes.