Add durable outbound messaging with FasterLog and RabbitMQ support #2
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Overview
This PR implements a complete durable outbound messaging system that enables decoupled, reliable handling of outbound calls using attribute-based configuration. Messages are persisted to ensure they are not lost and can be processed asynchronously by background workers.
Problem Statement
Applications often need to make outbound calls (emails, webhooks, external API calls) that:
Previously, developers had to manually implement queue infrastructure, which is complex and error-prone.
Solution
This PR adds a simple attribute-based approach similar to the existing
[ResiliencePipeline]attribute:With minimal configuration:
Method calls are automatically queued and processed by background workers, with the caller receiving an immediate response.
Key Features
🔒 Durable - Messages are persisted using FasterLog or RabbitMQ and won't be lost
🔀 Decoupled - Asynchronous processing with background workers
⚡ Fast - FasterLog backend provides high-performance file-based persistence
🐰 Scalable - RabbitMQ support for distributed scenarios
🛡️ Fault Tolerant - Automatic fallback to direct execution if queueing fails
📊 Observable - Comprehensive logging at every step
Implementation Details
Backend Options
FasterLog Backend
RabbitMQ Backend
Architecture
Files Added
Core Library (Kinetic2.Core/)
DurableOutboundAttribute.cs- Method attributeDurableMessage.cs- Message modelIDurableMessageHandler.cs- Handler and queue interfacesFasterLogMessageQueue.cs- FasterLog implementationRabbitMQMessageQueue.cs- RabbitMQ implementationDurableMessageProcessor.cs- Background processorDurableOutboundExtensions.cs- Service registrationDurableOutboundHelper.cs- Execution helperDocumentation
DURABLE_OUTBOUND.md- Comprehensive user guideIMPLEMENTATION_SUMMARY.md- Technical documentationreadme.mdwith feature overviewExample Usage
Testing
Dependencies Added
Microsoft.FASTER.Core(v2.4.0) - FasterLog supportRabbitMQ.Client(v6.8.1) - RabbitMQ supportSystem.Text.Json(v8.0.5) - Message serializationUse Cases
Breaking Changes
None. This is purely additive functionality that integrates seamlessly with existing code.
Future Enhancements
While the current implementation is production-ready, potential future improvements could include:
Original prompt
💬 Share your feedback on Copilot coding agent for the chance to win a $200 gift card! Click here to start the survey.