Yesterday you developed most of the design for funds-transfer-component
but left one question hanging. What was missing from the design?
As the design ended yesterday, when funds-transfer-component
recycles the Transfer
command, it’ll directly write a Withdraw
to account-component
. account-component
expects its callers to send a withdrawal_id
, and presumably, funds-transfer-component
would have to generate that each time it sends a Withdraw
.
Each time. Meaning, it’ll generate new identifiers for the same transfer. You thought you were moving 5 clams, but because of recycling, you’re moving 5 clams for each recycling.
Let’s find a better strategy for our job security.
Taking note of the identifiers
The hidden step reveals itself, the Initiated
event. The full flow with it:
When writing Initiated
, we copy all the fields from Transfer
, adding to it processedTime
, the point in time when it processed the message. We also generate withdrawalId
and depositId
, identifiers that we’ll use to send our clam-moving commands to account-component
, and attach those to Initiated
as well.
When handling the Initiated
event, we then use those previously-generated IDs to send commands to account-component
. Even when we recycle Initiated
, we’ll pick up the same identifiers each time. Because account-component
is idempotent, we’ll avoid duplicate clam movement.
Next steps
For our next step, we have to figure out how funds-transfer-component
will know when the account transactions complete. From the model, you can see it has something to do with account-component
’s Withdrawn
and Deposit
events, but how will we use those, and how will we know if a particular event from account-component
is one that we care about because it’s part of one of our transfers?
Give it a shot, and see if you can think of a solution.