SendEmail
コマンドを提供するEmailer
マイクロサービスを開発したいと考えています。イベントソーシングと削除可能データの組み合わせ
集計Email
:
- (
EmailCreated
) EmailDeliveryStarted
EmailDeliveryFailed
EmailRecipientDelivered
1 microservice内部で私は次のイベントで電子メール全体のプロセスを表し、心の中で集計を持っています受信者のメールアドレスEmailRecipientDeliveryFailed
受信者の1人は、電子メール- などのメール配信サービスSendGridが使用されている背景には
を受け取ることができませんでした。私のマイクロサービスは、自分自身のイベントでそのファサードのように機能します。 SendGridからの着信webhookは、適切なドメインイベントに変換されます。
コマンド
SendEmail
==>EmailCreated
EmailCreatedHandler
==> Eメール:プロセスは次のようになります。もちろん
Send
(SendGridへ)着信ウェブフック==>
EmailDeliveryStarted
- さらにウェブフック==>
EmailRecipientDelivered
、EmailRecipientDeliveryFailed
など
私は外部のWebサービスを交換したいと思います場合と私はそれに適応する他のメッセージング戦略を適用しますが、私のドメインモデルはイベントで保持します。クライアントに具体的なメール配信戦略について心配する必要はありません。
私が直面する重大な問題:SendGridがすぐに利用できない場合でも、SendEmail
コマンドを受け入れたいと思っています。メールデータ全体(添付ファイル付き)を保存してからイベントハンドラを起動する必要があります。送信プロセス。一方、私は最初のEmailCreated
イベントをこのBLOBデータで膨らませたくありません。そして、私はSendGridが私の電子メールの要求を受け入れた後にこのデータを整理できるようにしたい。
また、SendEmail
コマンドにSendGridに電子メールを送信し、最初にEmailDeliveryStarted
イベントを格納することもできます。しかし、これは、2フェーズ・コミットのように感じている:SendGridは私のコールを受け入れたが、何とか私のリポジトリは何かが間違っていたことをクライアントに通知されるだろうEmailDeliveryStarted
イベントを保存することができませんでしたし、それが災害だろうどの再びしようとした場合。
だから私は私の集計を設計する方法がわからないと、それは、添付ファイルなどのBLOBデータを含むべきではありませんので、より重要なのは、私のEmailCreated
イベント。