MongoDb Outbox
Usage
The MongoDB Outbox allows integration between MongoDB and Brighter's outbox support. The configuration is described in Basic Configuration.
To support transactional messaging when using MongoDB requires us to use MongoDB's support for ACID transactions. You should understand best practices for using transactions with MongoDB, including replica set requirements for multi-document transactions.
For this we will need the Outbox package for MongoDB:
Paramore.Brighter.Outbox.MongoDb
Paramore.Brighter.Outbox.MongoDb will pull in another package:
Paramore.Brighter.MongoDb
NuGet Packages
To use the MongoDB Outbox, you need to install the following packages from NuGet:
dotnet add package Paramore.Brighter.Outbox.MongoDb
dotnet add package Paramore.Brighter.MongoDbCollection Management
The MongoDB Outbox supports different strategies for collection management through the MakeCollection property:
OnResolvingACollection.Assume: Assumes the collection already exists (default behavior)OnResolvingACollection.Validate: Validates that the collection exists, throws an exception if it doesn'tOnResolvingACollection.Create: Creates the collection if it doesn't exist
Note: You are responsible for creating and maintaining the collection if you choose to manage it manually. This includes tasks such as adding indexes to optimize query performance and configuring Time-To-Live (TTL) indexes for automatic message cleanup.
Configuration
Basic Configuration
As described in Basic Configuration, we configure Brighter to use an outbox with the AddProducers method call.
Advanced Configuration
For more advanced scenarios, you can provide custom MongoDB client settings and collection configurations:
Using a Connection Provider
You can also use a custom connection provider for more control over the MongoDB connection:
Time-To-Live (TTL) Support
The MongoDB Outbox supports automatic message expiration using MongoDB's TTL feature. You can configure this through the TimeToLive property in the collection configuration:
When TTL is configured, MongoDB will automatically create a TTL index on the TimeStamp field and remove expired documents.
Using the Outbox in Handlers
In your handler, you take a dependency on Brighter's IAmATransactionConnectionProvider interface and convert it to a MongoDbUnitOfWork. You explicitly start a transaction within the handler and use MongoDB sessions for transactional consistency.
You call DepositPostAsync within that transaction to write the message to the Outbox. Once the transaction has closed, you can call ClearOutboxAsync to immediately clear, or you can rely on the Outbox Sweeper to clear for you.
Message Structure
The MongoDB Outbox stores messages as BSON documents with the following structure:
MessageId: The unique identifier for the message
Topic: The topic/destination for the message
MessageType: The type of the message
TimeStamp: When the message was created (UTC). Used for the TTL index
CorrelationId: Optional correlation identifier
ReplyTo: Optional reply-to address
ContentType: The content type of the message
PartitionKey: Optional partition key for message routing
HeaderBag: JSON serialized message headers
Body: The message body as bytes
Dispatched: Timestamp when the message was dispatched (null if not yet dispatched)
Here is an example of a message document stored in the outbox collection:
Error Handling
The MongoDB Outbox will throw appropriate exceptions for various error conditions:
ArgumentException: When required configuration is missing
MongoException: For MongoDB-specific errors like connection failures or transaction conflicts
InvalidOperationException: For outbox-specific errors like attempting operations without proper transaction context
Transaction Requirements
MongoDB transactions require:
MongoDB 4.0+ for replica sets
MongoDB 4.2+ for sharded clusters
Replica set deployment (transactions don't work on standalone instances)
Make sure your MongoDB deployment supports transactions before using the MongoDB Outbox pattern.
Last updated
Was this helpful?
