Reliable Transaction Submission
When making payments or recording transfers, it is important to ensure that they are recorded once and only once -- even if some parts of the system fail during the transaction.
There are some subtle gotchas to avoid, so this page describes how to submit events -- and especially transfers -- reliably.
The App or Browser Should Generate the ID
Transfer
s and Account
s
carry an id
field that is used as an idempotency key to ensure the same object is not created
twice.
The client software, such as your app or web page, that the user interacts with should generate
the id
(not your API). This id
should be persisted locally before submission, and the same id
should be used for subsequent retries.
- User initiates a transfer.
- Client software (app, web page, etc) generates the transfer
id
. - Client software persists the
id
in the app or browser local storage. - Client software submits the transfer to your API service.
- API service includes the transfer in a request.
- TigerBeetle creates the transfer with the given
id
once and only once. - TigerBeetle responds to the API service.
- The API service responds to the client software.
Handling Network Failures
The method described above handles various potential network failures. The request may be lost before it reaches the API service or before it reaches TigerBeetle. Or, the response may be lost on the way back from TigerBeetle.
Generating the id
on the client side ensures that transfers can be safely retried. The app must
use the same id
each time the transfer is resent.
If the transfer was already created before and then retried, TigerBeetle will return the
exists
response code. If the transfer had
not already been created, it will be created and return the
ok
.
Handling Client Software Restarts
The method described above also handles potential restarts of the app or browser while the request is in flight.
It is important to persist the id
to local storage on the client's device before submitting the
transfer. When the app or web page reloads, it should resubmit the transfer using the same id
.
This ensures that the operation can be safely retried even if the client app or browser restarts
before receiving the response to the operation. Similar to the case of a network failure,
TigerBeetle will respond with the ok
if a
transfer is newly created and exists
if an
object with the same id
was already created.