Carbonite.Outbox (Carbonite v0.2.0) View Source
Implements the outbox pattern to process (and evict) recorded transactions in the database, in order of insertion.
Link to this section Summary
Functions
Builds an Ecto.Multi that can be used to load Carbonite.Transaction records from database
(in order of insertion) and process them one-by-one through a function.
Builds an Ecto.Multi that can be used to delete Carbonite.Transaction records and their
associated Carbonite.Change rows from the database once they have been successfully processed
using process/2.
Link to this section Types
Specs
Specs
process_fun() :: (repo :: module(), Carbonite.Transaction.t() -> {:ok, any()} | {:error, any()})
Specs
process_option() ::
{:batch_size, non_neg_integer()}
| {:min_age, non_neg_integer()}
| {:prefix, prefix()}
Specs
purge_option() :: {:prefix, prefix()}
Link to this section Functions
Specs
process([process_option()], process_fun()) :: Ecto.Multi.t()
Builds an Ecto.Multi that can be used to load Carbonite.Transaction records from database
(in order of insertion) and process them one-by-one through a function.
Processed items are marked as processed and can be purged.
Options
batch_sizeis the size of records to load in one chunk, defaults to 20min_ageis the minimum age of a record, defaults to 300 seconds (see below)prefixis the Carbonite schema, defaults to"carbonite_default"
Long running transactions & insertion order
A warning: As Carbonite.Transaction records are inserted at the beginning of a database
transaction, their inserted_at is already a bit in the past when they become visible to other
connections, e.g. to your processing job. This means that in case of long running transactions,
Carbonite.Transaction records with more recent inserted_at values might be processed before
older ones, and hence the eventual total order of inserted_at in the processed records can
not be guaranteed. To mitigate this issue, Carbonite will by default exclude records younger than
min_age seconds from processing. Tweak this setting if you have even longer transactions.
Specs
purge([purge_option()]) :: Ecto.Multi.t()
Builds an Ecto.Multi that can be used to delete Carbonite.Transaction records and their
associated Carbonite.Change rows from the database once they have been successfully processed
using process/2.
Options
prefixis the Carbonite schema, defaults to"carbonite_default"