{"version":1,"pages":[{"id":"KSqTsE8meivE0DpeZEqg","title":"README","pathname":"/paramore-brighter-documentation","siteSpaceId":"sitesp_pK0in","description":"Documentation for the Brighter and Darker projects."},{"id":"HPzoGqwzpL2iHWdSXZlN","title":"Why Brighter?","pathname":"/paramore-brighter-documentation/get-started/whybrighter","siteSpaceId":"sitesp_pK0in","description":"Brighter and Darker are two of many options open to a .NET developer who needs a command processor, a command dispatcher, or a messaging framework.","breadcrumbs":[{"label":"Get Started"}]},{"id":"4QZ2ZXTuAU8CtaFpU11a","title":"Basic Concepts","pathname":"/paramore-brighter-documentation/get-started/basicconcepts","siteSpaceId":"sitesp_pK0in","description":"A command is an instruction to carry out work.","breadcrumbs":[{"label":"Get Started"}]},{"id":"GkqF2Xp3p6PgjrIKpQ0x","title":"Show me the code!","pathname":"/paramore-brighter-documentation/get-started/showmethecode","siteSpaceId":"sitesp_pK0in","description":"There is an old principle: show don't tell, and this introduction is about showing you what you can do with Brighter and Darker.","breadcrumbs":[{"label":"Get Started"}]},{"id":"6T0Iu0MY0O57gjMhcart","title":"Requests, Commands and Events","pathname":"/paramore-brighter-documentation/commands-handlers-and-pipelines/requests-commands-and-events","siteSpaceId":"sitesp_pK0in","description":"We use the term Request for a data object containing parameters that you want to dispatch to a handler.","breadcrumbs":[{"label":"Commands, Handlers and Pipelines"}]},{"id":"uDTMkUZ5ZOIkvUtHNPgm","title":"Dispatching Requests","pathname":"/paramore-brighter-documentation/commands-handlers-and-pipelines/dispatchingarequest","siteSpaceId":"sitesp_pK0in","description":"Once you have implemented your Request Handler, you will want to dispatch Commands and Events to it synchronously, through the Command Processor.","breadcrumbs":[{"label":"Commands, Handlers and Pipelines"}]},{"id":"51AprhZBXZofrCb6dcJl","title":"Dispatching an Async Request","pathname":"/paramore-brighter-documentation/commands-handlers-and-pipelines/dispatchingarequest/asyncdispatcharequest","siteSpaceId":"sitesp_pK0in","description":"Once you have implemented your async Request Handler, you will want to dispatch Commands and Events to it through the Command Processor's asynchronous methods.","breadcrumbs":[{"label":"Commands, Handlers and Pipelines"},{"label":"Dispatching Requests"}]},{"id":"bFDCbyU0GySXrhIkZZDC","title":"Returning Results from a Handler","pathname":"/paramore-brighter-documentation/commands-handlers-and-pipelines/dispatchingarequest/returningresultsfromahandler","siteSpaceId":"sitesp_pK0in","description":"We use Command-Query separation so a Command does not have a return value and CommandDispatcher.Send() does not return anything.","breadcrumbs":[{"label":"Commands, Handlers and Pipelines"},{"label":"Dispatching Requests"}]},{"id":"zGca17KiKH7L8WRUnSbB","title":"How to Implement a Request Handler","pathname":"/paramore-brighter-documentation/commands-handlers-and-pipelines/implementingahandler","siteSpaceId":"sitesp_pK0in","description":"To implement a handler, derive from RequestHandler<T> where T should be the Command or Event derived type that you wish to handle.","breadcrumbs":[{"label":"Commands, Handlers and Pipelines"}]},{"id":"YS6cMJTxCuuyQFEQ5sYX","title":"How to Implement an Async Request Handler","pathname":"/paramore-brighter-documentation/commands-handlers-and-pipelines/implementingahandler/implementingasynchandler","siteSpaceId":"sitesp_pK0in","description":"To implement an asynchronous handler, derive from RequestHandlerAsync<T> where T should be the Command or Event derived type that you wish to handle.","breadcrumbs":[{"label":"Commands, Handlers and Pipelines"},{"label":"How to Implement a Request Handler"}]},{"id":"HPoTjSFscTs1u91ba4JX","title":"Building a Pipeline of Request Handlers","pathname":"/paramore-brighter-documentation/commands-handlers-and-pipelines/buildingapipeline","siteSpaceId":"sitesp_pK0in","description":"Once Brighter is dispatching requests to your handlers, you can insert orthogonal operations into the pipeline that runs around each handler.","breadcrumbs":[{"label":"Commands, Handlers and Pipelines"}]},{"id":"odtBbpLsT6LCRKixRO2R","title":"Building an Async Pipeline of Request Handlers","pathname":"/paramore-brighter-documentation/commands-handlers-and-pipelines/buildingapipeline/buildinganasyncpipeline","siteSpaceId":"sitesp_pK0in","description":"An async pipeline wraps an async request handler in the same orthogonal operations a synchronous pipeline uses, with attributes whose handlers await.","breadcrumbs":[{"label":"Commands, Handlers and Pipelines"},{"label":"Building a Pipeline of Request Handlers"}]},{"id":"J9sOAysTInR9875Djvb4","title":"Passing Information Between Handlers in the Pipeline","pathname":"/paramore-brighter-documentation/commands-handlers-and-pipelines/buildingapipeline/usingthecontextbag","siteSpaceId":"sitesp_pK0in","description":"A key constraint of the Pipes and Filters architectural style is that Filters do not share state.","breadcrumbs":[{"label":"Commands, Handlers and Pipelines"},{"label":"Building a Pipeline of Request Handlers"}]},{"id":"MTQ3iPqijrLlHMhVF5uh","title":"Pipeline Validation and Diagnostics","pathname":"/paramore-brighter-documentation/commands-handlers-and-pipelines/buildingapipeline/pipelinevalidation","siteSpaceId":"sitesp_pK0in","description":"Brighter can validate your pipeline configuration at startup, catching common mistakes before any messages are sent or consumed.","breadcrumbs":[{"label":"Commands, Handlers and Pipelines"},{"label":"Building a Pipeline of Request Handlers"}]},{"id":"GezDPpUoas796sXaR6Ib","title":"Request Validation","pathname":"/paramore-brighter-documentation/commands-handlers-and-pipelines/buildingapipeline/requestvalidation","siteSpaceId":"sitesp_pK0in","description":"Brighter can validate a request in its handler pipeline before your business handler runs.","breadcrumbs":[{"label":"Commands, Handlers and Pipelines"},{"label":"Building a Pipeline of Request Handlers"}]},{"id":"869zrytcAFKZ12MQr2kv","title":"Feature Switches","pathname":"/paramore-brighter-documentation/commands-handlers-and-pipelines/buildingapipeline/featureswitches","siteSpaceId":"sitesp_pK0in","description":"We provide a FeatureSwitch Attribute and FeatureSwitchAsync Attribute that you can use on your IHandleRequests<TRequest>.Handle() method, and IHandleRequests<TRequest>.HandleAysnc() method.","breadcrumbs":[{"label":"Commands, Handlers and Pipelines"},{"label":"Building a Pipeline of Request Handlers"}]},{"id":"JCWhn7SeYZRMH6LFKKQc","title":"Supporting Retry and Circuit Breaker","pathname":"/paramore-brighter-documentation/commands-handlers-and-pipelines/buildingapipeline/policyretryandcircuitbreaker","siteSpaceId":"sitesp_pK0in","description":"Brighter is a Command Processor and supports a pipeline of Handlers to handle orthogonal requests.","breadcrumbs":[{"label":"Commands, Handlers and Pipelines"},{"label":"Building a Pipeline of Request Handlers"}]},{"id":"ffc9h4qMZdyckFYaK1wY","title":"Migrating to Polly v8","pathname":"/paramore-brighter-documentation/commands-handlers-and-pipelines/buildingapipeline/policyretryandcircuitbreaker/migratingtopollyv8","siteSpaceId":"sitesp_pK0in","description":"Both tails of the Polly story in one place.","breadcrumbs":[{"label":"Commands, Handlers and Pipelines"},{"label":"Building a Pipeline of Request Handlers"},{"label":"Supporting Retry and Circuit Breaker"}]},{"id":"M0DqeKTUCWsdcNFWehZU","title":"Failure and Fallback","pathname":"/paramore-brighter-documentation/commands-handlers-and-pipelines/buildingapipeline/policyfallback","siteSpaceId":"sitesp_pK0in","description":"A Fallback is a backstop exception handler, which runs when a request has failed and lets you take compensating action.","breadcrumbs":[{"label":"Commands, Handlers and Pipelines"},{"label":"Building a Pipeline of Request Handlers"}]},{"id":"B3yyh1MahiHIo9MtMbIk","title":"Agreement Dispatcher","pathname":"/paramore-brighter-documentation/commands-handlers-and-pipelines/agreementdispatcher","siteSpaceId":"sitesp_pK0in","description":"The Agreement Dispatcher is a pattern for routing requests to handlers dynamically based on the request's content or context, rather than using a fixed type-to-handler mapping.","breadcrumbs":[{"label":"Commands, Handlers and Pipelines"}]},{"id":"2Z7TdohyzECFM00gXuvb","title":"Agreement Dispatcher Routing","pathname":"/paramore-brighter-documentation/commands-handlers-and-pipelines/agreementdispatcher/agreementdispatcherrouting","siteSpaceId":"sitesp_pK0in","description":"Why you would route a request by its content rather than its type, what that buys you, and what it costs.","breadcrumbs":[{"label":"Commands, Handlers and Pipelines"},{"label":"Agreement Dispatcher"}]},{"id":"JaM5ux3cHtC0osf70Qal","title":"Basic Configuration","pathname":"/paramore-brighter-documentation/brighter-configuration/brighterbasicconfiguration","siteSpaceId":"sitesp_pK0in","description":"Configuration is the most labor-intensive part of using Brighter.","breadcrumbs":[{"label":"Brighter Configuration"}]},{"id":"xqqOCyzObifdBWbv6sBa","title":"Command Processor Configuration Reference","pathname":"/paramore-brighter-documentation/brighter-configuration/brighterbasicconfiguration/commandprocessorconfigurationreference","siteSpaceId":"sitesp_pK0in","description":"Every option for configuring a Brighter Command Processor, in one place.","breadcrumbs":[{"label":"Brighter Configuration"},{"label":"Basic Configuration"}]},{"id":"CYcfCwNRMuhKhifOA885","title":"Dispatcher Configuration Reference","pathname":"/paramore-brighter-documentation/brighter-configuration/brighterbasicconfiguration/dispatcherconfigurationreference","siteSpaceId":"sitesp_pK0in","description":"Every option for configuring a Brighter Dispatcher, in one place.","breadcrumbs":[{"label":"Brighter Configuration"},{"label":"Basic Configuration"}]},{"id":"dP2dDFCDZ5pw060m2TAP","title":"InMemory Options for Development and Testing","pathname":"/paramore-brighter-documentation/brighter-configuration/inmemoryoptions","siteSpaceId":"sitesp_pK0in","description":"Brighter V10 provides a comprehensive suite of in-memory implementations for key components, making it easy to develop and test applications without external dependencies.","breadcrumbs":[{"label":"Brighter Configuration"}]},{"id":"udB6R7GG5sUgrjm7d0Tv","title":"Test Double Options for Command Processor","pathname":"/paramore-brighter-documentation/brighter-configuration/testdoubleoptions","siteSpaceId":"sitesp_pK0in","description":"When handlers depend on IAmACommandProcessor to publish events or send commands, you need a way to verify those interactions in tests.","breadcrumbs":[{"label":"Brighter Configuration"}]},{"id":"BBXtBJ9Jb14wnmcbyE4p","title":"Analyzer Support","pathname":"/paramore-brighter-documentation/brighter-configuration/analyzersupport","siteSpaceId":"sitesp_pK0in","description":"Brighter provides Roslyn analyzers that detect common configuration and message-mapping mistakes while you write and build your application.","breadcrumbs":[{"label":"Brighter Configuration"}]},{"id":"10zPX86JDoLKiM4yHvC3","title":"Using an External Bus","pathname":"/paramore-brighter-documentation/using-an-external-bus/implementingexternalbus","siteSpaceId":"sitesp_pK0in","description":"Brighter provides support for an External Bus.","breadcrumbs":[{"label":"Using an External Bus"}]},{"id":"1RGvWCzMGaQdzy4s6n1D","title":"Routing","pathname":"/paramore-brighter-documentation/using-an-external-bus/routing","siteSpaceId":"sitesp_pK0in","description":"A producer routes messages to subscribers by setting a Topic on the MessageHeader.","breadcrumbs":[{"label":"Using an External Bus"}]},{"id":"j38svkXo1fLBiYdiVCud","title":"Message Mappers","pathname":"/paramore-brighter-documentation/using-an-external-bus/messagemappers","siteSpaceId":"sitesp_pK0in","description":"A message mapper turns domain code into a Brighter Message.","breadcrumbs":[{"label":"Using an External Bus"}]},{"id":"8csaRCCE9ffjUfXet14X","title":"Default Message Mappers","pathname":"/paramore-brighter-documentation/using-an-external-bus/messagemappers/defaultmessagemappers","siteSpaceId":"sitesp_pK0in","description":"You do not need to implement IAmAMessageMapper for every message type.","breadcrumbs":[{"label":"Using an External Bus"},{"label":"Message Mappers"}]},{"id":"1DbjouGs2yAVwpm5qO6T","title":"Message Transforms","pathname":"/paramore-brighter-documentation/using-an-external-bus/messagemappers/messagetransforms","siteSpaceId":"sitesp_pK0in","description":"A transform is middleware in the mapping pipeline, and Brighter finds it by reflecting over the attributes on your mapper's MapToMessage and MapToRequest methods.","breadcrumbs":[{"label":"Using an External Bus"},{"label":"Message Mappers"}]},{"id":"SHhsTsXJLGHjr6lIY72j","title":"Cloud Events Support","pathname":"/paramore-brighter-documentation/using-an-external-bus/cloudeventssupport","siteSpaceId":"sitesp_pK0in","description":"CloudEvents is a CNCF specification for describing event data in a common, standardized way.","breadcrumbs":[{"label":"Using an External Bus"}]},{"id":"agCxTdsVAvqK1ifDnjsJ","title":"CloudEvents Reference","pathname":"/paramore-brighter-documentation/using-an-external-bus/cloudeventssupport/cloudeventsreference","siteSpaceId":"sitesp_pK0in","description":"CloudEvents defines both required and optional attributes for events.","breadcrumbs":[{"label":"Using an External Bus"},{"label":"Cloud Events Support"}]},{"id":"PWiYRsiYBhywdaQlSnbV","title":"Claim Check","pathname":"/paramore-brighter-documentation/using-an-external-bus/claimcheck","siteSpaceId":"sitesp_pK0in","description":"The Claim Check pattern helps us reduce the size of our messages, without losing information that we need to exchange.","breadcrumbs":[{"label":"Using an External Bus"}]},{"id":"cMwjzMYpn5s6lWj9crCD","title":"S3 Luggage Store","pathname":"/paramore-brighter-documentation/using-an-external-bus/claimcheck/s3luggagestore","siteSpaceId":"sitesp_pK0in","description":"The S3LuggageStore is an implementation of IAmAStorageProviderAsync for AWS S3 Object Storage.","breadcrumbs":[{"label":"Using an External Bus"},{"label":"Claim Check"}]},{"id":"OTiGS1IhT8gCF4c2Me0k","title":"Compression","pathname":"/paramore-brighter-documentation/using-an-external-bus/compression","siteSpaceId":"sitesp_pK0in","description":"The Compression transform helps us reduce the size of a message using a compression algorithm.","breadcrumbs":[{"label":"Using an External Bus"}]},{"id":"AHBE3Adyg0wQKjzgnTTW","title":"Dynamic Message Deserialization","pathname":"/paramore-brighter-documentation/using-an-external-bus/dynamicmessagedeserialization","siteSpaceId":"sitesp_pK0in","description":"Brighter supports dynamic type resolution, allowing you to route multiple message types through a single channel.","breadcrumbs":[{"label":"Using an External Bus"}]},{"id":"HFONXUbuvE6KjzGyEAG6","title":"Routing Multiple Message Types","pathname":"/paramore-brighter-documentation/using-an-external-bus/dynamicmessagedeserialization/routingmultiplemessagetypes","siteSpaceId":"sitesp_pK0in","description":"The most common approach for dynamic deserialization is using the CloudEvents type attribute.","breadcrumbs":[{"label":"Using an External Bus"},{"label":"Dynamic Message Deserialization"}]},{"id":"wd1lni8TCPwiwnqfOnox","title":"AsyncAPI Document Generation","pathname":"/paramore-brighter-documentation/using-an-external-bus/asyncapisupport","siteSpaceId":"sitesp_pK0in","description":"Brighter can automatically generate AsyncAPI 3.0 documents from your service's runtime configuration.","breadcrumbs":[{"label":"Using an External Bus"}]},{"id":"T2rLDk18t2VCG9xcWfVd","title":"Error Handling","pathname":"/paramore-brighter-documentation/using-an-external-bus/handlerfailure","siteSpaceId":"sitesp_pK0in","description":"When your handler throws an exception on the External Bus, Brighter's message pump catches it and decides what to do with the message.","breadcrumbs":[{"label":"Using an External Bus"}]},{"id":"Jw7VlA1eTqBBZFdGBgo0","title":"Error Handling Options","pathname":"/paramore-brighter-documentation/using-an-external-bus/handlerfailure/errorhandlingoptions","siteSpaceId":"sitesp_pK0in","description":"Brighter's message pump uses Subscription properties to control how it handles errors.","breadcrumbs":[{"label":"Using an External Bus"},{"label":"Error Handling"}]},{"id":"wlCYLBzvtG4Y4I8s4Gzm","title":"RabbitMQ Configuration","pathname":"/paramore-brighter-documentation/transports/rabbitmqconfiguration","siteSpaceId":"sitesp_pK0in","description":"RabbitMQ is OSS message-oriented-middleware and is well documented.","breadcrumbs":[{"label":"Transports"}]},{"id":"0PGWS5NaSWRnyZVgLIeo","title":"RabbitMQ Durability: Quorum Queues and Persistence","pathname":"/paramore-brighter-documentation/transports/rabbitmqconfiguration/rabbitmqdurability","siteSpaceId":"sitesp_pK0in","description":"RabbitMQ offers two independent durability mechanisms, and they answer different questions.","breadcrumbs":[{"label":"Transports"},{"label":"RabbitMQ Configuration"}]},{"id":"y8FgCtGvbLPQrrfWD4LW","title":"Migrating to Quorum Queues","pathname":"/paramore-brighter-documentation/transports/rabbitmqconfiguration/rabbitmqmigratetoquorumqueues","siteSpaceId":"sitesp_pK0in","description":"This guide moves an existing Brighter subscription from a classic queue to a quorum queue, and enables message persistence alongside it.","breadcrumbs":[{"label":"Transports"},{"label":"RabbitMQ Configuration"}]},{"id":"w1mxJ0MCN5i0rfNnPKuZ","title":"RabbitMQ Connection Stability","pathname":"/paramore-brighter-documentation/transports/rabbitmqconfiguration/rabbitmqconnectionstability","siteSpaceId":"sitesp_pK0in","description":"V10 includes improvements to RabbitMQ connection handling and error recovery, making applications more resilient to network issues and broker restarts.","breadcrumbs":[{"label":"Transports"},{"label":"RabbitMQ Configuration"}]},{"id":"oYYaYlXNtEX8XiM9B9QC","title":"Kafka Configuration","pathname":"/paramore-brighter-documentation/transports/kafkaconfiguration","siteSpaceId":"sitesp_pK0in","description":"Kafka is OSS message-oriented-middleware and is well documented.","breadcrumbs":[{"label":"Transports"}]},{"id":"sBuYprvlr2oE0mysnme2","title":"AWS SNS and SQS Configuration","pathname":"/paramore-brighter-documentation/transports/awssqsconfiguration","siteSpaceId":"sitesp_pK0in","description":"SNS and SQS are proprietary message-oriented-middleware available on the AWS platform.","breadcrumbs":[{"label":"Transports"}]},{"id":"h9euolSXKHwQ6eH4IKKN","title":"Migrating AWS SQS to V10","pathname":"/paramore-brighter-documentation/transports/awssqsconfiguration/awssqsmigratetov10","siteSpaceId":"sitesp_pK0in","description":"Brighter provides support for both version 3 and version 4 of the AWS SDK for .NET through separate NuGet packages.","breadcrumbs":[{"label":"Transports"},{"label":"AWS SNS and SQS Configuration"}]},{"id":"vgKzPPnTbbpf947dXPLF","title":"Azure Service Bus Configuration","pathname":"/paramore-brighter-documentation/transports/azureservicebusconfiguration","siteSpaceId":"sitesp_pK0in","description":"Azure Service Bus (ASB) is a fully managed enterprise message broker and is well documented Brighter handles the details of sending to or receiving from ASB.","breadcrumbs":[{"label":"Transports"}]},{"id":"4ajChxvZX24PLxFnESsc","title":"PostgreSQL Message Broker","pathname":"/paramore-brighter-documentation/transports/postgresqlmessagebroker","siteSpaceId":"sitesp_pK0in","description":"Brighter supports for using PostgreSQL as a message broker, enabling pub/sub messaging patterns using your existing PostgreSQL infrastructure.","breadcrumbs":[{"label":"Transports"}]},{"id":"8M7hLkSGf2RcqABHHHDO","title":"PostgreSQL Broker Trade-Offs","pathname":"/paramore-brighter-documentation/transports/postgresqlmessagebroker/postgresqlbrokertradeoffs","siteSpaceId":"sitesp_pK0in","description":"This page is what you read when deciding whether to use PostgreSQL as a broker at all: what it buys you, where it runs out, how it stores a payload, and how it compares with the dedicated brokers.","breadcrumbs":[{"label":"Transports"},{"label":"PostgreSQL Message Broker"}]},{"id":"LyVyXib9v90rEo9Hk6vR","title":"InMemory Transport","pathname":"/paramore-brighter-documentation/transports/inmemorytransport","siteSpaceId":"sitesp_pK0in","description":"The in-process transport: when to use it, how to configure it, a complete example, and its limits.","breadcrumbs":[{"label":"Transports"}]},{"id":"XFZ8jEQSikn8vzybvQHu","title":"Brighter Control API","pathname":"/paramore-brighter-documentation/transports/brightercontrolapi","siteSpaceId":"sitesp_pK0in","description":"The Brighter Control API allows direct management of a Dispatcher node.","breadcrumbs":[{"label":"Transports"}]},{"id":"UUrIHra8zfPTxjxVmssx","title":"Outbox Support","pathname":"/paramore-brighter-documentation/outbox-and-inbox/brighteroutboxsupport","siteSpaceId":"sitesp_pK0in","description":"Brighter supports storing messages that are sent via an External Bus in an Outbox, as per the Outbox Pattern.","breadcrumbs":[{"label":"Outbox and Inbox"}]},{"id":"v9T5h4vE9Pvocsp3fSfx","title":"MSSQL Outbox","pathname":"/paramore-brighter-documentation/outbox-and-inbox/brighteroutboxsupport/mssqloutbox","siteSpaceId":"sitesp_pK0in","description":"The MSSQL Outbox provides a message store for the Transactional Outbox pattern using a Microsoft SQL Server database.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Outbox Support"}]},{"id":"LapRMh8SKzcMHs1ghD5C","title":"MySQL Outbox","pathname":"/paramore-brighter-documentation/outbox-and-inbox/brighteroutboxsupport/mysqloutbox","siteSpaceId":"sitesp_pK0in","description":"The MySQL Outbox provides a message store for the Transactional Outbox pattern using a MySQL database.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Outbox Support"}]},{"id":"jaAt3GHY1qQovCxG1mja","title":"Postgres Outbox","pathname":"/paramore-brighter-documentation/outbox-and-inbox/brighteroutboxsupport/postgresoutbox","siteSpaceId":"sitesp_pK0in","description":"The PostgreSQL Outbox provides a message store for the Transactional Outbox pattern using a PostgreSQL database.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Outbox Support"}]},{"id":"44Zi4YYfJEc37zFLYCyB","title":"Sqlite Outbox","pathname":"/paramore-brighter-documentation/outbox-and-inbox/brighteroutboxsupport/sqliteoutbox","siteSpaceId":"sitesp_pK0in","description":"The SQLite Outbox provides a message store for the Transactional Outbox pattern using a SQLite database.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Outbox Support"}]},{"id":"2MScaeXTrW12SYB9CmTx","title":"Dapper Outbox","pathname":"/paramore-brighter-documentation/outbox-and-inbox/brighteroutboxsupport/dapperoutbox","siteSpaceId":"sitesp_pK0in","description":"The Dapper Outbox allows integration between Dapper and Brighter's outbox support.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Outbox Support"}]},{"id":"yc6bnCk8ScYplWrEa5Tx","title":"EF Core Outbox","pathname":"/paramore-brighter-documentation/outbox-and-inbox/brighteroutboxsupport/efcoreoutbox","siteSpaceId":"sitesp_pK0in","description":"The EFCore Outbox allows integration between EF Core and Brighter's outbox support.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Outbox Support"}]},{"id":"UDUiPM0XKyQ4j8XUjhQ8","title":"Dynamo Outbox","pathname":"/paramore-brighter-documentation/outbox-and-inbox/brighteroutboxsupport/dynamooutbox","siteSpaceId":"sitesp_pK0in","description":"The DynamoDb Outbox allows integration between DynamoDb and Brighter's outbox support.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Outbox Support"}]},{"id":"yfnXF9DOMInrhOnzl8zQ","title":"MongoDb Outbox","pathname":"/paramore-brighter-documentation/outbox-and-inbox/brighteroutboxsupport/mongodboutbox","siteSpaceId":"sitesp_pK0in","description":"The MongoDB Outbox allows integration between MongoDB and Brighter's outbox support.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Outbox Support"}]},{"id":"75s1GcbDHtJWkQz2jq6i","title":"InMemory Outbox","pathname":"/paramore-brighter-documentation/outbox-and-inbox/brighteroutboxsupport/inmemoryoutbox","siteSpaceId":"sitesp_pK0in","description":"The in-process Outbox: flushing, compaction, configuration and limits.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Outbox Support"}]},{"id":"8cancektqIMATR7S8hBN","title":"Transactional Messaging with the Outbox","pathname":"/paramore-brighter-documentation/outbox-and-inbox/transactionalmessagingwiththeoutbox","siteSpaceId":"sitesp_pK0in","description":"This section provides a complete example showing both producer and consumer using transactional messaging with the Outbox and Inbox patterns.","breadcrumbs":[{"label":"Outbox and Inbox"}]},{"id":"F4FVw02RuvpgHXYftrFp","title":"Outbox Archiver","pathname":"/paramore-brighter-documentation/outbox-and-inbox/outboxarchiver","siteSpaceId":"sitesp_pK0in","description":"The Outbox Archiver is a background service that monitors an Outbox and moves messages older than a certain age into long-term storage, keeping your Outbox small.","breadcrumbs":[{"label":"Outbox and Inbox"}]},{"id":"gow9a4142B3tLjuHG6Zq","title":"Azure Blob Archive Provider","pathname":"/paramore-brighter-documentation/outbox-and-inbox/outboxarchiver/azureblobarchiveprovider","siteSpaceId":"sitesp_pK0in","description":"The Azure Blob Archive Provider is a provider for Outbox Archiver.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Outbox Archiver"}]},{"id":"S9xrQocTGqno4jg5eaA0","title":"Azure Archive Provider Configuration","pathname":"/paramore-brighter-documentation/outbox-and-inbox/outboxarchiver/azureblobarchiveprovider/azureblobconfiguration","siteSpaceId":"sitesp_pK0in","description":"The Azure Archive Provider writes messages swept from your Outbox into an Azure Blob Storage container.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Outbox Archiver"},{"label":"Azure Blob Archive Provider"}]},{"id":"ZZfnwXzw4HHfHn4dgs6t","title":"Sweeper Circuit Breaking","pathname":"/paramore-brighter-documentation/outbox-and-inbox/sweepercircuitbreaking","siteSpaceId":"sitesp_pK0in","description":"Sweeper Circuit Breaking is a resilience feature that prevents failures to publish to one topic from blocking attempts to publish to other topics, when publishing messages from the Outbox.","breadcrumbs":[{"label":"Outbox and Inbox"}]},{"id":"y8F7v1PUk0BE2BWtBgdL","title":"Using Sweeper Circuit Breaking","pathname":"/paramore-brighter-documentation/outbox-and-inbox/sweepercircuitbreaking/usingsweepercircuitbreaking","siteSpaceId":"sitesp_pK0in","description":"How to wire circuit breaking into an Outbox Sweeper, tune its cooldown, and extend it with your own or a distributed breaker.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Sweeper Circuit Breaking"}]},{"id":"oUlYstvE8YajnTakBxp0","title":"Inbox Support","pathname":"/paramore-brighter-documentation/outbox-and-inbox/brighterinboxsupport","siteSpaceId":"sitesp_pK0in","description":"Messaging makes the guaranteed, at least once promise.","breadcrumbs":[{"label":"Outbox and Inbox"}]},{"id":"uhX9EFLYBWPDnJTf9wNN","title":"MSSQL Inbox","pathname":"/paramore-brighter-documentation/outbox-and-inbox/brighterinboxsupport/mssqlinbox","siteSpaceId":"sitesp_pK0in","description":"The MSSQL Inbox allows use of MSSQL for Brighter's inbox support.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Inbox Support"}]},{"id":"mgzpjgL8I2EpGgoKxPd2","title":"MySQL Inbox","pathname":"/paramore-brighter-documentation/outbox-and-inbox/brighterinboxsupport/mysqlinbox","siteSpaceId":"sitesp_pK0in","description":"The MySQL Inbox allows use of MySQL for Brighter's inbox support.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Inbox Support"}]},{"id":"sX9YgpGuxUQ97eByjbK9","title":"Postgres Inbox","pathname":"/paramore-brighter-documentation/outbox-and-inbox/brighterinboxsupport/postgresinbox","siteSpaceId":"sitesp_pK0in","description":"The Postgres Inbox allows use of Postgres for Brighter's inbox support.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Inbox Support"}]},{"id":"NGOKQTNUOONZDZe8zn5h","title":"Sqlite Inbox","pathname":"/paramore-brighter-documentation/outbox-and-inbox/brighterinboxsupport/sqliteinbox","siteSpaceId":"sitesp_pK0in","description":"The Sqlite Inbox allows use of Sqlite for Brighter's inbox support.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Inbox Support"}]},{"id":"jNjdssbr5w35jjL3FJzx","title":"Dynamo Inbox","pathname":"/paramore-brighter-documentation/outbox-and-inbox/brighterinboxsupport/dynamoinbox","siteSpaceId":"sitesp_pK0in","description":"The DynamoDb Inbox allows use of DynamoDb for Brighter's inbox support.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Inbox Support"}]},{"id":"Mb1haRfpbMjjFfqretMq","title":"MongoDb Inbox","pathname":"/paramore-brighter-documentation/outbox-and-inbox/brighterinboxsupport/mongodbinbox","siteSpaceId":"sitesp_pK0in","description":"The MongoDB Inbox allows use of MongoDB for Brighter's inbox support.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Inbox Support"}]},{"id":"27umB5Si2omC3TUKFYKv","title":"InMemory Inbox","pathname":"/paramore-brighter-documentation/outbox-and-inbox/brighterinboxsupport/inmemoryinbox","siteSpaceId":"sitesp_pK0in","description":"The in-process Inbox: when to use it, how to configure it, and its limits.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Inbox Support"}]},{"id":"wjLmL17dkM70BG2tKaaJ","title":"Replay On Seen","pathname":"/paramore-brighter-documentation/outbox-and-inbox/replayonseen","siteSpaceId":"sitesp_pK0in","description":"When your Inbox recognises a message it has already handled, it normally throws or logs a warning and stops — the work is done, so there is nothing to do.","breadcrumbs":[{"label":"Outbox and Inbox"}]},{"id":"DneYRGMnrA4FXS11Wofi","title":"Turning On Replay On Seen","pathname":"/paramore-brighter-documentation/outbox-and-inbox/replayonseen/turningonreplayonseen","siteSpaceId":"sitesp_pK0in","description":"This page is the procedure: what to switch on, what you must thread through your code, what to check before you enable it, and a worked example.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Replay On Seen"}]},{"id":"TT6peDrjH4XcPb2krXin","title":"Replay On Seen Reference","pathname":"/paramore-brighter-documentation/outbox-and-inbox/replayonseen/replayonseenreference","siteSpaceId":"sitesp_pK0in","description":"Which stores support Replay On Seen, the cases where it does not fire, the events it emits, and its limitations.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Replay On Seen"}]},{"id":"9bpAKS7SN4hPjVNfttuO","title":"Causation Tracking in a Custom Store","pathname":"/paramore-brighter-documentation/outbox-and-inbox/causationtrackingstores","siteSpaceId":"sitesp_pK0in","description":"Replay On Seen needs two things from your storage.","breadcrumbs":[{"label":"Outbox and Inbox"}]},{"id":"M0ZQlGPtGr2ZCsr8SIzu","title":"Distributed Lock","pathname":"/paramore-brighter-documentation/outbox-and-inbox/distributedlock","siteSpaceId":"sitesp_pK0in","description":"A distributed lock lets multiple instances of your application coordinate so that only one of them performs a given task at a time.","breadcrumbs":[{"label":"Outbox and Inbox"}]},{"id":"llpZhXaXUPU2YWAdD3b1","title":"DynamoDB Distributed Lock","pathname":"/paramore-brighter-documentation/outbox-and-inbox/distributedlock/dynamodbdistributedlock","siteSpaceId":"sitesp_pK0in","description":"The DynamoDB locking provider implements Brighter's distributed lock on top of Amazon DynamoDB, so a single Outbox Sweeper and Archiver run when you scale out.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Distributed Lock"}]},{"id":"pHc66iIq3pYV2IBWQrNn","title":"Postgres Distributed Lock","pathname":"/paramore-brighter-documentation/outbox-and-inbox/distributedlock/postgresdistributedlock","siteSpaceId":"sitesp_pK0in","description":"The Postgres locking provider implements Brighter's distributed lock using PostgreSQL advisory locks, so a single Outbox Sweeper and Archiver run when you scale out.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Distributed Lock"}]},{"id":"ElyvpzzG8ZbSomeamfD8","title":"MSSQL Distributed Lock","pathname":"/paramore-brighter-documentation/outbox-and-inbox/distributedlock/mssqldistributedlock","siteSpaceId":"sitesp_pK0in","description":"The MS SQL locking provider implements Brighter's distributed lock using SQL Server application locks (sp_getapplock / sp_releaseapplock).","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Distributed Lock"}]},{"id":"1sHHon9lGxw8TnNjPPOi","title":"MySQL Distributed Lock","pathname":"/paramore-brighter-documentation/outbox-and-inbox/distributedlock/mysqldistributedlock","siteSpaceId":"sitesp_pK0in","description":"The MySQL locking provider implements Brighter's distributed lock using MySQL's named locks (GET_LOCK / RELEASE_LOCK), so a single Outbox Sweeper and Archiver run when you scale out.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Distributed Lock"}]},{"id":"R7saBaNwwxo76H0HnZcQ","title":"Azure Blob Distributed Lock","pathname":"/paramore-brighter-documentation/outbox-and-inbox/distributedlock/azureblobdistributedlock","siteSpaceId":"sitesp_pK0in","description":"The Azure Blob locking provider implements Brighter's distributed lock using blob leases in Azure Blob Storage, so a single Outbox Sweeper and Archiver run when you scale out.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Distributed Lock"}]},{"id":"XprfoMoFaWDND1GjpsrE","title":"MongoDB Distributed Lock","pathname":"/paramore-brighter-documentation/outbox-and-inbox/distributedlock/mongodbdistributedlock","siteSpaceId":"sitesp_pK0in","description":"The MongoDB locking provider implements Brighter's distributed lock by writing lock documents to a MongoDB collection, so a single Outbox Sweeper and Archiver run when you scale out.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Distributed Lock"}]},{"id":"sF9Zx9ZFeYSyN5y3tUxR","title":"Firestore Distributed Lock","pathname":"/paramore-brighter-documentation/outbox-and-inbox/distributedlock/firestoredistributedlock","siteSpaceId":"sitesp_pK0in","description":"The Firestore locking provider implements Brighter's distributed lock using Google Cloud Firestore, so a single Outbox Sweeper and Archiver run when you scale out.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Distributed Lock"}]},{"id":"WSFoXJRah7Cg9xYMe1dE","title":"Box Provisioning","pathname":"/paramore-brighter-documentation/outbox-and-inbox/boxprovisioning","siteSpaceId":"sitesp_pK0in","description":"BoxProvisioning is the Brighter library that creates and migrates your Outbox and Inbox tables at application startup.","breadcrumbs":[{"label":"Outbox and Inbox"}]},{"id":"aNVXgKUA9pzje11gGNCr","title":"Configuring Box Provisioning","pathname":"/paramore-brighter-documentation/outbox-and-inbox/boxprovisioning/boxprovisioningconfiguration","siteSpaceId":"sitesp_pK0in","description":"This page is the how-to companion to Box Provisioning.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Box Provisioning"}]},{"id":"w1McXacvd76zCbHkz7yE","title":"Upgrading Existing Deployments","pathname":"/paramore-brighter-documentation/outbox-and-inbox/boxprovisioning/boxprovisioningupgrade","siteSpaceId":"sitesp_pK0in","description":"This page is for operators of a pre-existing Brighter deployment who are adopting Database Provisioning for the first time.","breadcrumbs":[{"label":"Outbox and Inbox"},{"label":"Box Provisioning"}]},{"id":"uM7QkpoRUCjkqJiJSDqv","title":"Scheduler","pathname":"/paramore-brighter-documentation/scheduler/brighterschedulersupport","siteSpaceId":"sitesp_pK0in","description":"In distributed applications, it is often necessary to schedule messages for deferred execution—whether for implementing delayed workflows, retry mechanisms, or time-based business processes.","breadcrumbs":[{"label":"Scheduler"}]},{"id":"l52xJgTC1OmZp6c5Ysmb","title":"InMemory Scheduler","pathname":"/paramore-brighter-documentation/scheduler/brighterschedulersupport/inmemoryscheduler","siteSpaceId":"sitesp_pK0in","description":"The InMemory Scheduler is a lightweight, timer-based scheduling implementation provided by Brighter for testing, development, and demonstration purposes.","breadcrumbs":[{"label":"Scheduler"},{"label":"Scheduler"}]},{"id":"dQdHGUSHjKkIG2bFqqiF","title":"Hangfire","pathname":"/paramore-brighter-documentation/scheduler/brighterschedulersupport/hangfirescheduler","siteSpaceId":"sitesp_pK0in","description":"Hangfire is one of the most widely used background job processing libraries in the .NET community, featuring a built-in monitoring dashboard.","breadcrumbs":[{"label":"Scheduler"},{"label":"Scheduler"}]},{"id":"oYZIIcg7JSgJzsPGOle2","title":"Quartz","pathname":"/paramore-brighter-documentation/scheduler/brighterschedulersupport/quartzscheduler","siteSpaceId":"sitesp_pK0in","description":"Quartz.NET is one of the most widely used enterprise-grade scheduling libraries in the .NET community.","breadcrumbs":[{"label":"Scheduler"},{"label":"Scheduler"}]},{"id":"3LAv3k9nqK0V5wuXNbJP","title":"TickerQ","pathname":"/paramore-brighter-documentation/scheduler/brighterschedulersupport/tickerqscheduler","siteSpaceId":"sitesp_pK0in","description":"TickerQ is a high-performance, reflection-free background task scheduler for .NET that uses source generators.","breadcrumbs":[{"label":"Scheduler"},{"label":"Scheduler"}]},{"id":"5Ch21MYO7Gxza1p7QoSY","title":"Aws Scheduler","pathname":"/paramore-brighter-documentation/scheduler/brighterschedulersupport/awsscheduler","siteSpaceId":"sitesp_pK0in","description":"AWS EventBridge Scheduler is a fully managed, serverless service on AWS that allows you to create, run, and manage scheduled tasks at scale.","breadcrumbs":[{"label":"Scheduler"},{"label":"Scheduler"}]},{"id":"6RcDjJuvKKTaRDXuHTUT","title":"Azure Scheduler","pathname":"/paramore-brighter-documentation/scheduler/brighterschedulersupport/azurescheduler","siteSpaceId":"sitesp_pK0in","description":"Azure Service Bus includes native support for scheduled message delivery using the ScheduledEnqueueTimeUtc property.","breadcrumbs":[{"label":"Scheduler"},{"label":"Scheduler"}]},{"id":"tL4aqtfBkuT7g3sDbrIN","title":"Scheduling a Message","pathname":"/paramore-brighter-documentation/scheduler/schedulingamessage","siteSpaceId":"sitesp_pK0in","description":"This page shows you how to schedule a message or request for deferred execution, how to cancel one you have already scheduled, and how to configure each scheduler for the job.","breadcrumbs":[{"label":"Scheduler"}]},{"id":"PSPQIi6RI7XwMx13mVon","title":"Switching Schedulers","pathname":"/paramore-brighter-documentation/scheduler/switchingschedulers","siteSpaceId":"sitesp_pK0in","description":"This page shows you how to move an existing application from one Brighter scheduler to another.","breadcrumbs":[{"label":"Scheduler"}]},{"id":"wn6C1hqP0s0kXpLpQsjW","title":"Custom Scheduler","pathname":"/paramore-brighter-documentation/scheduler/customscheduler","siteSpaceId":"sitesp_pK0in","description":"To add support for a different scheduler provider, implement the appropriate interfaces based on your use case.","breadcrumbs":[{"label":"Scheduler"}]},{"id":"SwGflBdwfzu8dP1jhjPP","title":"Darker Basic Configuration","pathname":"/paramore-brighter-documentation/darker/darkerbasicconfiguration","siteSpaceId":"sitesp_pK0in","description":"Darker is the query-side counterpart to Brighter, implementing the Query Object pattern for CQRS (Command Query Responsibility Segregation) architectures.","breadcrumbs":[{"label":"Darker"}]},{"id":"dupVIkNLarldz7oUBy2C","title":"Darker Configuration Reference","pathname":"/paramore-brighter-documentation/darker/darkerbasicconfiguration/darkerconfigurationreference","siteSpaceId":"sitesp_pK0in","description":"The options AddDarker and AddHandlersFromAssemblies take: the query processor's service lifetime, and the strategies available for registering handlers.","breadcrumbs":[{"label":"Darker"},{"label":"Darker Basic Configuration"}]},{"id":"Mys3ZRWdKpfSquDUe82p","title":"Queries and Query Objects","pathname":"/paramore-brighter-documentation/darker/queriesandqueryobjects","siteSpaceId":"sitesp_pK0in","description":"The Query Object pattern separates the parameters of a query from the execution of that query.","breadcrumbs":[{"label":"Darker"}]},{"id":"Lq8EPWUYMxfGLurYiWfy","title":"Query Result Types","pathname":"/paramore-brighter-documentation/darker/queriesandqueryobjects/queryresulttypes","siteSpaceId":"sitesp_pK0in","description":"The result type specified in IQuery<TResult> can be any C# type.","breadcrumbs":[{"label":"Darker"},{"label":"Queries and Query Objects"}]},{"id":"eWycb7BSryo4dtoGMuUe","title":"Query Object Validation","pathname":"/paramore-brighter-documentation/darker/queriesandqueryobjects/queryobjectvalidation","siteSpaceId":"sitesp_pK0in","description":"Query objects should validate their parameters to ensure they receive valid data.","breadcrumbs":[{"label":"Darker"},{"label":"Queries and Query Objects"}]},{"id":"bDcXyctQFmZcbxVtarxc","title":"How to Implement a Query Handler","pathname":"/paramore-brighter-documentation/darker/implementaqueryhandler","siteSpaceId":"sitesp_pK0in","description":"Query handlers are the entry point to your query execution logic in Darker.","breadcrumbs":[{"label":"Darker"}]},{"id":"RhEFZc3fOrwTC8aDx4l6","title":"Query Handler Dependencies","pathname":"/paramore-brighter-documentation/darker/implementaqueryhandler/queryhandlerdependencies","siteSpaceId":"sitesp_pK0in","description":"Query handlers typically need dependencies like repositories, database contexts, or services to execute queries.","breadcrumbs":[{"label":"Darker"},{"label":"How to Implement a Query Handler"}]},{"id":"ksEvDsdAJrXjI316NeFW","title":"Testing Query Handlers","pathname":"/paramore-brighter-documentation/darker/implementaqueryhandler/testingqueryhandlers","siteSpaceId":"sitesp_pK0in","description":"Query handlers are easy to test because they have clear inputs (queries) and outputs (results), with dependencies that can be mocked or replaced.","breadcrumbs":[{"label":"Darker"},{"label":"How to Implement a Query Handler"}]},{"id":"mzWW7EoVM8Bu81S6TqoB","title":"Query Pipeline and Decorators","pathname":"/paramore-brighter-documentation/darker/querypipeline","siteSpaceId":"sitesp_pK0in","description":"The Query Pipeline in Darker provides a powerful way to add cross-cutting concerns to your query handlers without modifying the handler code itself.","breadcrumbs":[{"label":"Darker"}]},{"id":"P0vu5ruGmyNTkJZ7CBnv","title":"Query Pipeline Policies","pathname":"/paramore-brighter-documentation/darker/querypipeline/querypipelinepolicies","siteSpaceId":"sitesp_pK0in","description":"Darker's policy decorators are powered by Polly, a .NET resilience and transient-fault-handling library.","breadcrumbs":[{"label":"Darker"},{"label":"Query Pipeline and Decorators"}]},{"id":"sjpRhecOIfJ347379zvv","title":"Darker and Brighter Pipelines","pathname":"/paramore-brighter-documentation/darker/querypipeline/darkerandbrighterpipelines","siteSpaceId":"sitesp_pK0in","description":"Darker's query pipeline shares many similarities with Brighter's request pipeline, as both implement the same Russian Doll Model for middleware composition.","breadcrumbs":[{"label":"Darker"},{"label":"Query Pipeline and Decorators"}]},{"id":"6103IB0qvIGEuUhQ2sRA","title":"Query Patterns","pathname":"/paramore-brighter-documentation/darker/querypatterns","siteSpaceId":"sitesp_pK0in","description":"This guide presents common query patterns you'll encounter when building real-world applications with Darker.","breadcrumbs":[{"label":"Darker"}]},{"id":"Gr8tJ73hCNrf47rCqKDi","title":"Parameterized Query Patterns","pathname":"/paramore-brighter-documentation/darker/querypatterns/parameterizedquerypatterns","siteSpaceId":"sitesp_pK0in","description":"Query recipes that take parameters: looking up a single entity, filtering a list, and searching on several criteria at once.","breadcrumbs":[{"label":"Darker"},{"label":"Query Patterns"}]},{"id":"Y7MDvfrSsJBArKQ5s21M","title":"Pagination Query Patterns","pathname":"/paramore-brighter-documentation/darker/querypatterns/paginationquerypatterns","siteSpaceId":"sitesp_pK0in","description":"How to page through a large result set in Darker, by offset and by cursor, with the trade-offs of each.","breadcrumbs":[{"label":"Darker"},{"label":"Query Patterns"}]},{"id":"AKFVrFSpyHTGoekExiap","title":"Projection Query Patterns","pathname":"/paramore-brighter-documentation/darker/querypatterns/projectionquerypatterns","siteSpaceId":"sitesp_pK0in","description":"How to return only the fields a caller needs: simple projections, projections across joins, and calculated fields.","breadcrumbs":[{"label":"Darker"},{"label":"Query Patterns"}]},{"id":"9ExwuPK85HDopvdWoJcQ","title":"Collection and Aggregation Query Patterns","pathname":"/paramore-brighter-documentation/darker/querypatterns/aggregationquerypatterns","siteSpaceId":"sitesp_pK0in","description":"How to return whole collections, counts, and summary statistics from a query handler.","breadcrumbs":[{"label":"Darker"},{"label":"Query Patterns"}]},{"id":"MYridAneqW3wGyvz54gt","title":"Entity Framework Core Query Integration","pathname":"/paramore-brighter-documentation/darker/querypatterns/efcorequeryintegration","siteSpaceId":"sitesp_pK0in","description":"How to run Darker queries against Entity Framework Core: tracking, eager loading, handler lifetime and compiled queries.","breadcrumbs":[{"label":"Darker"},{"label":"Query Patterns"}]},{"id":"JIKc6AVaDmy4UYdT6wh0","title":"Logging","pathname":"/paramore-brighter-documentation/health-checks-and-observability/logging","siteSpaceId":"sitesp_pK0in","description":"Brighter writes its diagnostics through Microsoft.Extensions.Logging, and takes its ILoggerFactory from a single static holder rather than from your container.","breadcrumbs":[{"label":"Health Checks and Observability"}]},{"id":"QQvHyftkOu6gm0blETFz","title":"Monitoring","pathname":"/paramore-brighter-documentation/health-checks-and-observability/monitoring","siteSpaceId":"sitesp_pK0in","description":"Brighter emits monitoring information from an External Bus using a configured Control Bus.","breadcrumbs":[{"label":"Health Checks and Observability"}]},{"id":"qmqzZr13DUSHOcekToEN","title":"Health Checks","pathname":"/paramore-brighter-documentation/health-checks-and-observability/healthchecks","siteSpaceId":"sitesp_pK0in","description":"Brighter provides an AspNet Core Health check for the Dispatcher.","breadcrumbs":[{"label":"Health Checks and Observability"}]},{"id":"EIZm2lEcjtSgKi1cJTdN","title":"Telemetry","pathname":"/paramore-brighter-documentation/health-checks-and-observability/telemetry","siteSpaceId":"sitesp_pK0in","description":"Brighter provides comprehensive OpenTelemetry integration for distributed tracing across message boundaries, enabling end-to-end observability in distributed systems.","breadcrumbs":[{"label":"Health Checks and Observability"}]},{"id":"t7WMqpq83sCtD3fuxtik","title":"Configuring OpenTelemetry","pathname":"/paramore-brighter-documentation/health-checks-and-observability/telemetry/configuringopentelemetry","siteSpaceId":"sitesp_pK0in","description":"The OpenTelemetry SDK can be configured to listen to Activities emitted by Brighter.","breadcrumbs":[{"label":"Health Checks and Observability"},{"label":"Telemetry"}]},{"id":"aoeWQtJX2koqEWyppA7f","title":"V10 Migration Guide","pathname":"/paramore-brighter-documentation/v10-migration/v10migrationguide","siteSpaceId":"sitesp_pK0in","description":"Brighter V10 introduces significant improvements and new features while maintaining a clear migration path from V9.","breadcrumbs":[{"label":"V10 Migration"}]},{"id":"D5OcakQjAUkmF9FGl8mD","title":"Nullable Reference Types","pathname":"/paramore-brighter-documentation/v10-migration/nullablereferencetypes","siteSpaceId":"sitesp_pK0in","description":"V10 enables nullable reference types across all Brighter projects, providing improved type safety and helping prevent null reference exceptions.","breadcrumbs":[{"label":"V10 Migration"}]},{"id":"JsHP9gLXW0p56FCw2ZE2","title":"Migrating to Nullable Reference Types","pathname":"/paramore-brighter-documentation/v10-migration/nullablereferencetypes/migratingtonullablereferencetypes","siteSpaceId":"sitesp_pK0in","description":"Four steps to turn nullable reference types on in a project that uses Brighter.","breadcrumbs":[{"label":"V10 Migration"},{"label":"Nullable Reference Types"}]},{"id":"8fVxYesYFDpz2ZKm8jdm","title":"Command, Processor and Dispatcher Patterns","pathname":"/paramore-brighter-documentation/understanding-brighter/commandscommanddispatcherandprocessor","siteSpaceId":"sitesp_pK0in","description":"The Command design pattern encapsulates a request as an object, allowing reuse, queuing or logging of requests, or undoable operations.","breadcrumbs":[{"label":"Understanding Brighter"}]},{"id":"zhXVP584kSnd7qUJDNeh","title":"Using a Task Queue","pathname":"/paramore-brighter-documentation/understanding-brighter/taskqueuepattern","siteSpaceId":"sitesp_pK0in","description":"The Task Queue Pattern let's you use an External Bus to handle work asynchronously.","breadcrumbs":[{"label":"Understanding Brighter"}]},{"id":"iS0Y1UDREYQ2atz5CogO","title":"Microservices","pathname":"/paramore-brighter-documentation/understanding-brighter/microservices","siteSpaceId":"sitesp_pK0in","description":"It is possible to think of microservices as 3rd generation SOA.","breadcrumbs":[{"label":"Understanding Brighter"}]},{"id":"MbVikctfFZae7Zzc5qSo","title":"Event Driven Collaboration","pathname":"/paramore-brighter-documentation/understanding-brighter/eventdrivencollaboration","siteSpaceId":"sitesp_pK0in","description":"Event Driven Architectures (EDA) are a major use case for Brighter's External Bus-you want processes to collaborate via messaging.","breadcrumbs":[{"label":"Understanding Brighter"}]},{"id":"nxnKmdg6OhnWqFcYeJNp","title":"Event Carried State Transfer","pathname":"/paramore-brighter-documentation/understanding-brighter/eventcarriedstatetransfer","siteSpaceId":"sitesp_pK0in","description":"In his white paper \"Data on the Outside vs. Data on the Inside\", Pat Helland classifies data according to whether it exists inside a service boundary or outside that boundary.","breadcrumbs":[{"label":"Understanding Brighter"}]},{"id":"NLM96cyfnp11rRHNXhpj","title":"Outbox Pattern","pathname":"/paramore-brighter-documentation/understanding-brighter/outboxpattern","siteSpaceId":"sitesp_pK0in","description":"The Outbox Pattern is what stops a state change and the event announcing it from diverging.","breadcrumbs":[{"label":"Understanding Brighter"}]},{"id":"4kSmTgIRvgiwEhSuKNbl","title":"CQRS with Brighter and Darker","pathname":"/paramore-brighter-documentation/understanding-brighter/cqrswithbrighteranddarker","siteSpaceId":"sitesp_pK0in","description":"Command Query Responsibility Segregation (CQRS) separates the handling of commands, which change state, from queries, which read it.","breadcrumbs":[{"label":"Understanding Brighter"}]},{"id":"hJHR5z2tTqKhGY93WHB9","title":"CQRS Use Cases and Patterns","pathname":"/paramore-brighter-documentation/understanding-brighter/cqrswithbrighteranddarker/cqrsusecasesandpatterns","siteSpaceId":"sitesp_pK0in","description":"Four shapes a CQRS system takes in practice, from a single database with two models to event-sourced writes with projected reads.","breadcrumbs":[{"label":"Understanding Brighter"},{"label":"CQRS with Brighter and Darker"}]},{"id":"h0GjjkyXo8oZJWjEirSS","title":"How the Command Processor Works","pathname":"/paramore-brighter-documentation/understanding-brighter/howbrighterworks","siteSpaceId":"sitesp_pK0in","description":"You don't need to understand how Brighter works under the hood to use it, but if you want to debug, or contribute to the project, it can help to know what is going on.","breadcrumbs":[{"label":"Understanding Brighter"}]},{"id":"7ugYaRKxoX6Ndt5PTPF0","title":"How Configuring the Command Processor Works","pathname":"/paramore-brighter-documentation/understanding-brighter/howbrighterworks/howconfiguringthecommandprocessorworks","siteSpaceId":"sitesp_pK0in","description":"Brighter does not have a dependency on an Inversion Of Control (IoC) framework.","breadcrumbs":[{"label":"Understanding Brighter"},{"label":"How the Command Processor Works"}]},{"id":"j3tZXJlClUg2c79xIs5y","title":"How the Dispatcher Works","pathname":"/paramore-brighter-documentation/understanding-brighter/howserviceactivatorworks","siteSpaceId":"sitesp_pK0in","description":"The Dispatcher is the component in the Brighter.ServiceActivator assembly that orchestrates your Performers.","breadcrumbs":[{"label":"Understanding Brighter"}]},{"id":"ammUTvIoq58mSg1UzlPZ","title":"How Configuring a Dispatcher for an External Bus Works","pathname":"/paramore-brighter-documentation/understanding-brighter/howserviceactivatorworks/howconfiguringthedispatcherworks","siteSpaceId":"sitesp_pK0in","description":"In order to receive messages from Message Oriented Middleware (MoM) such as RabbitMQ or Kafka you have to configure a Dispatcher.","breadcrumbs":[{"label":"Understanding Brighter"},{"label":"How the Dispatcher Works"}]},{"id":"IMewiJOB1xqhPQpCx24j","title":"Reactor and Proactor: Concurrency Models","pathname":"/paramore-brighter-documentation/understanding-brighter/reactorandproactor","siteSpaceId":"sitesp_pK0in","description":"Brighter V10 introduces clearer terminology for its concurrency models: Reactor and Proactor.","breadcrumbs":[{"label":"Understanding Brighter"}]},{"id":"xhE6hnJDvgzlESLLgaKh","title":"Glossary","pathname":"/paramore-brighter-documentation/reference/glossary","siteSpaceId":"sitesp_pK0in","description":"This glossary provides definitions for key terms used in Brighter and Darker.","breadcrumbs":[{"label":"Reference"}]},{"id":"vmh83p1uLZqGc5ztR4NL","title":"FAQ","pathname":"/paramore-brighter-documentation/reference/faq","siteSpaceId":"sitesp_pK0in","description":"This FAQ addresses common questions about using Brighter and Darker, organized by category.","breadcrumbs":[{"label":"Reference"}]},{"id":"UWCsrTsbBums6vNfeRjZ","title":"README","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). Documentation for the Brighter and Darker projects."},{"id":"J0JJrhA7I5xXTmBGBGKk","title":"Show me the code!","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/overview/showmethecode","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). There is an old principle: show don't tell, and this introduction is about showing you what you can do with Brighter and Darker.","breadcrumbs":[{"label":"Overview"}]},{"id":"AbCegBLLxAzdr2c8UI3z","title":"Basic Concepts","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/overview/basicconcepts","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). A command is an instruction to carry out work.","breadcrumbs":[{"label":"Overview"}]},{"id":"WAPGALQzrYGpFCcEM7Px","title":"Why Brighter?","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/overview/whybrighter","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). There are many options for .NET developers looking for either a package to use as a command processor/dispatcher pattern implementation (sometimes confused with the…","breadcrumbs":[{"label":"Overview"}]},{"id":"BSKEfRHLveKhusrw4CbL","title":"Basic Configuration","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-configuration/brighterbasicconfiguration","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). Configuration is the most labor-intensive part of using Brighter.Once you have configured Brighter, using its model of requests and handlers is straightforward","breadcrumbs":[{"label":"Brighter Configuration"}]},{"id":"orTOPxNL2ra9vwdQf9jx","title":"How Configuring the Command Processor Works","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-configuration/howconfiguringthecommandprocessorworks","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). Brighter does not have a dependency on an Inversion Of Control (IoC) framework.","breadcrumbs":[{"label":"Brighter Configuration"}]},{"id":"mLdAchABWf6Ck7Syq5FG","title":"How Configuring a Dispatcher for an External Bus Works","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-configuration/howconfiguringthedispatcherworks","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). In order to receive messages from Message Oriented Middleware (MoM) such as RabbitMQ or Kafka you have to configure a Dispatcher.","breadcrumbs":[{"label":"Brighter Configuration"}]},{"id":"3R8v2lHCzR87xQ3P0PE9","title":"RabbitMQ Configuration","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-configuration/rabbitmqconfiguration","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). RabbitMQ is OSS message-oriented-middleware and is well documented.","breadcrumbs":[{"label":"Brighter Configuration"}]},{"id":"vHqj6FHOQ9QQ5cGa5Wtr","title":"AWS SNS Configuration","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-configuration/awssqsconfiguration","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). SNS and SQS are proprietary message-oriented-middleware available on the AWS platform.","breadcrumbs":[{"label":"Brighter Configuration"}]},{"id":"wYYj58l7ehgxlsyfqxVf","title":"Kafka Configuration","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-configuration/kafkaconfiguration","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). Kafka is OSS message-oriented-middleware and is well documented.","breadcrumbs":[{"label":"Brighter Configuration"}]},{"id":"Z7Saz1rGIKHNOwMmx3GI","title":"Azure Service Bus Configuration","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-configuration/azureservicebusconfiguration","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). Azure Service Bus (ASB) is a fully managed enterprise message broker and is well documented Brighter handles the details of sending to or receiving from ASB.","breadcrumbs":[{"label":"Brighter Configuration"}]},{"id":"P9NUhHLd5AfdPJpNLXRb","title":"Azure Archive Provider Configuration","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-configuration/azureblobconfiguration","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). Azure Service Bus (ASB) is a fully managed enterprise message broker and is well documented Brighter handles the details of sending to or receiving from ASB.","breadcrumbs":[{"label":"Brighter Configuration"}]},{"id":"lv72vIaZdWTeQRElmXBu","title":"Brighter Control API","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-configuration/brightercontrolapi","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). The brighter control API allows direct management of a Service Activator node","breadcrumbs":[{"label":"Brighter Configuration"}]},{"id":"eT65qRFHtx66UP1HH7l2","title":"Building an Async Pipeline of Request Handlers","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-request-handlers-and-middleware-pipelines/buildinganasyncpipeline","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). Once you are using the features of Brighter to act as a command dispatcher and send or publish messages to a target handler, you may want to use its command processor…","breadcrumbs":[{"label":"Brighter Request Handlers and Middleware Pipelines"}]},{"id":"VXDJ792yhbgmVffEuS0v","title":"How to Implement a Request Handler","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-request-handlers-and-middleware-pipelines/implementingahandler","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). To implement a handler, derive from RequestHandler<T> where T should be the Command or Event derived type that you wish to handle.","breadcrumbs":[{"label":"Brighter Request Handlers and Middleware Pipelines"}]},{"id":"nAnA1y7EZ5GJOVy5Lpzq","title":"How to Implement an Async Request Handler","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-request-handlers-and-middleware-pipelines/implementingasynchandler","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). To implement an asynchronous handler, derive from RequestHandlerAsync<T> where T should be the Command or Event derived type that you wish to handle.","breadcrumbs":[{"label":"Brighter Request Handlers and Middleware Pipelines"}]},{"id":"ss4qF5Uu1hKAJZESyci6","title":"Requests, Commands and an Events","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-request-handlers-and-middleware-pipelines/requests-commands-and-events","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). We use the term Request for a data object containing parameters that you want to dispatch to a handler.","breadcrumbs":[{"label":"Brighter Request Handlers and Middleware Pipelines"}]},{"id":"XAuojZ9iXxpgDYVYwGjW","title":"Dispatching Requests","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-request-handlers-and-middleware-pipelines/dispatchingarequest","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). Once you have implemented your Request Handler, you will want to dispatch Commands or Events to that Handler.","breadcrumbs":[{"label":"Brighter Request Handlers and Middleware Pipelines"}]},{"id":"biTAYSYJ8auiFh41ETBS","title":"Dispatching An Async Request","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-request-handlers-and-middleware-pipelines/asyncdispatcharequest","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). Once you have implemented your Request Handler, you will want to dispatch Commands or Events to that Handler.","breadcrumbs":[{"label":"Brighter Request Handlers and Middleware Pipelines"}]},{"id":"ao8v9lfySY0JlPfKUGVT","title":"Returning results from a Handler","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-request-handlers-and-middleware-pipelines/returningresultsfromahandler","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). We use Command-Query separation so a Command does not have return value and CommandDispatcher.Send() does not return anything.","breadcrumbs":[{"label":"Brighter Request Handlers and Middleware Pipelines"}]},{"id":"0O7ZHIJqCbp5OuUE1f0Z","title":"Using an External Bus","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-request-handlers-and-middleware-pipelines/implementingexternalbus","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). Brighter provides support for an External Bus.","breadcrumbs":[{"label":"Brighter Request Handlers and Middleware Pipelines"}]},{"id":"Hd3l71pLpHimfe9iN3MS","title":"Message Mappers","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-request-handlers-and-middleware-pipelines/messagemappers","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). A message mapper turns domain code into a Brighter Message.","breadcrumbs":[{"label":"Brighter Request Handlers and Middleware Pipelines"}]},{"id":"gHP6t0yiQILZOjMiqv8s","title":"Claim Check","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-request-handlers-and-middleware-pipelines/claimcheck","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). The Claim Check pattern helps us reduce the size of our messages, without losing information that we need to exchange.","breadcrumbs":[{"label":"Brighter Request Handlers and Middleware Pipelines"}]},{"id":"bpQ245EvOviZ3KuYwrQZ","title":"Compression","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-request-handlers-and-middleware-pipelines/compression","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). The Compression transform helps us reduce the size of a message using a compression algorithm.","breadcrumbs":[{"label":"Brighter Request Handlers and Middleware Pipelines"}]},{"id":"9RwSAeeJojXMUT4AhfJt","title":"S3 Luggage Store","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-request-handlers-and-middleware-pipelines/s3luggagestore","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). The S3LuggageStore is an implementation of IAmAStorageProviderAsync for AWS S3 Object Storage.","breadcrumbs":[{"label":"Brighter Request Handlers and Middleware Pipelines"}]},{"id":"G3MTk3wSFmGdIiTqJAuw","title":"Routing","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-request-handlers-and-middleware-pipelines/routing","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). A producer routes messages to subscribers by setting a Topic on the MessageHeader.","breadcrumbs":[{"label":"Brighter Request Handlers and Middleware Pipelines"}]},{"id":"TUkeWGr70wuuVgg6UYVH","title":"Building a Pipeline of Request Handlers","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-request-handlers-and-middleware-pipelines/buildingapipeline","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). Once you are using the features of Brighter to act as a command dispatcher and send or publish messages to a target handler, you may want to use its command processor…","breadcrumbs":[{"label":"Brighter Request Handlers and Middleware Pipelines"}]},{"id":"HZmTJLZvnRT3gkOdzfpZ","title":"Passing information between Handlers in the Pipeline","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-request-handlers-and-middleware-pipelines/usingthecontextbag","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). A key constraint of the Pipes and Filters architectural style is that Filters do not share state.","breadcrumbs":[{"label":"Brighter Request Handlers and Middleware Pipelines"}]},{"id":"4SccrkWrWQCE5qYa9xMZ","title":"Failure and Dead Letter Queues","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-request-handlers-and-middleware-pipelines/handlerfailure","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). When a Request is passed to RequestHandler.Handle() it runs in your application code.","breadcrumbs":[{"label":"Brighter Request Handlers and Middleware Pipelines"}]},{"id":"OK22YTLgYFyY2W3Qgz1z","title":"Supporting Retry and Circuit Breaker","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-request-handlers-and-middleware-pipelines/policyretryandcircuitbreaker","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). Brighter is a Command Processor and supports a pipeline of Handlers to handle orthogonal requests.","breadcrumbs":[{"label":"Brighter Request Handlers and Middleware Pipelines"}]},{"id":"wKZvparERZIN2l5CfvtC","title":"Failure and Fallback","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-request-handlers-and-middleware-pipelines/policyfallback","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). You may want some sort of backstop exception handler, that allows you to take compensating action, such as undoing any partially committed work, issuing a compensating…","breadcrumbs":[{"label":"Brighter Request Handlers and Middleware Pipelines"}]},{"id":"q7q00DoeA6vDqNsvfiRu","title":"Feature Switches","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/brighter-request-handlers-and-middleware-pipelines/featureswitches","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). We provide a FeatureSwitch Attribute and FeatureSwitchAsync Attribute that you can use on your IHandleRequests<TRequest>.Handle() method, and…","breadcrumbs":[{"label":"Brighter Request Handlers and Middleware Pipelines"}]},{"id":"GFsJlaBj7SCMH5gVtic4","title":"Outbox Support","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/guaranteed-at-least-once/brighteroutboxsupport","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). Brighter supports storing messages that are sent via an External Bus in an Outbox, as per the Outbox Pattern","breadcrumbs":[{"label":"Guaranteed At Least Once"}]},{"id":"jDEHKPfXsfEgIEbVw5wA","title":"Inbox Support","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/guaranteed-at-least-once/brighterinboxsupport","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). Messaging makes the guaranteed, at least once promise.","breadcrumbs":[{"label":"Guaranteed At Least Once"}]},{"id":"kTPEyRsz2YnIA9CDC3Jh","title":"EFCore Outbox","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/guaranteed-at-least-once/efcoreoutbox","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). The EFCore Outbox allows integration between EF Core and Brighter's outbox support.","breadcrumbs":[{"label":"Guaranteed At Least Once"}]},{"id":"U1w1V7JNIDDrqc3wwgEZ","title":"Dapper Outbox","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/guaranteed-at-least-once/dapperoutbox","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). The Dapper Outbox allows integration between Dapper and Brighter's outbox support.","breadcrumbs":[{"label":"Guaranteed At Least Once"}]},{"id":"S53pnALqybO55aV9qssK","title":"Dynamo Outbox","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/guaranteed-at-least-once/dynamooutbox","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). The DynamoDb Outbox allows integration between DynamoDb and Brighter's outbox support.","breadcrumbs":[{"label":"Guaranteed At Least Once"}]},{"id":"vl2gGYHklfrFoN8zPGhk","title":"MSSQL Inbox","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/guaranteed-at-least-once/mssqlinbox","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). The MSSQL Inbox allows use of MSSQL for Brighter's inbox support.","breadcrumbs":[{"label":"Guaranteed At Least Once"}]},{"id":"K5sWuVUwKCGoO5r2D45p","title":"MySQL Inbox","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/guaranteed-at-least-once/mysqlinbox","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). The MySQL Inbox allows use of MySQL for Brighter's inbox support.","breadcrumbs":[{"label":"Guaranteed At Least Once"}]},{"id":"4ZStt2G2RW1E8e0C5K68","title":"Postgres Inbox","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/guaranteed-at-least-once/postgresinbox","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). The Postgres Inbox allows use of Postgres for Brighter's inbox support.","breadcrumbs":[{"label":"Guaranteed At Least Once"}]},{"id":"MGrL1tQXYUseRZROVMdt","title":"Sqlite Inbox","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/guaranteed-at-least-once/sqliteinbox","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). The Sqlite Inbox allows use of Sqlite for Brighter's inbox support.","breadcrumbs":[{"label":"Guaranteed At Least Once"}]},{"id":"8yORv0sFhZgo9sr1ibgf","title":"Dynamo Inbox","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/guaranteed-at-least-once/dynamoinbox","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). The DynamoDb Inbox allows use of DynamoDb for Brighter's inbox support.","breadcrumbs":[{"label":"Guaranteed At Least Once"}]},{"id":"4wpS5XaUdGW8hhlDsKGc","title":"Azure Blob Archive Provider","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/guaranteed-at-least-once/azureblobarchiveprovider","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). The Azure Blob Archive Provider is a provider for Outbox Archiver.","breadcrumbs":[{"label":"Guaranteed At Least Once"}]},{"id":"aW7gh5z5D62mbt2ws7Cx","title":"Monitoring","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/health-checks-and-observability/monitoring","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). Brighter emits monitoring information from an External Bus using a configured Control Bus","breadcrumbs":[{"label":"Health Checks and Observability"}]},{"id":"8BGLjQ7CeimjN7OIzP02","title":"Health Checks","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/health-checks-and-observability/healthchecks","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). Brighter provides an AspNet Core Health check for Service Activator","breadcrumbs":[{"label":"Health Checks and Observability"}]},{"id":"TEVBIbkgkqHLOudcMqYs","title":"Telemetry","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/health-checks-and-observability/telemetry","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). Starting in version 9.2.1 Brighter now supports Open Telemetry Tracing","breadcrumbs":[{"label":"Health Checks and Observability"}]},{"id":"AQJ1QPuLLt9KgJ59s8Ep","title":"Command, Processor and Dispatcher Patterns","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/command-processors-and-dispatchers/commandscommanddispatcherandprocessor","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). The Command design pattern encapsulates a request as an object, allowing reuse, queuing or logging of requests, or undoable operations.","breadcrumbs":[{"label":"Command, Processors and Dispatchers"}]},{"id":"jwFxnVDH83OOJKqv997T","title":"How The Command Processor Works","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/under-the-hood/howbrighterworks","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). You don't need to understand how Brighter works under the hood to use it, but if you want to debug, or contribute to the project, it can help to know what is going on.","breadcrumbs":[{"label":"Under the Hood"}]},{"id":"DxggRwsypJSKP1Ym3JKf","title":"How Service Activator Works","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/under-the-hood/howserviceactivatorworks","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). Coming Soon...","breadcrumbs":[{"label":"Under the Hood"}]},{"id":"ToCdTt9BLqwpR93V56RK","title":"Microservices","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/event-driven-architectures/microservices","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). It is possible to think of microservices as 3rd generation SOA.","breadcrumbs":[{"label":"Event Driven Architectures"}]},{"id":"ir5bo9vBwtLqE9Gja39G","title":"Event Driven Collaboration","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/event-driven-architectures/eventdrivencollaboration","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). Event Driven Architectures (EDA) are a major use case for Brighter's External Bus-you want processes to collaborate via messaging.","breadcrumbs":[{"label":"Event Driven Architectures"}]},{"id":"EH8zztMrXaOdRIVLXvP8","title":"Event Carried State Transfer","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/event-driven-architectures/eventcarriedstatetransfer","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). In his white paper \"Data on the Outside vs. Data on the Inside\", Pat Helland classifies data according to whether it exists inside a service boundary or outside that…","breadcrumbs":[{"label":"Event Driven Architectures"}]},{"id":"T4rAEacdk4xiyvAdwgm0","title":"Outbox Pattern","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/event-driven-architectures/outboxpattern","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). When a microservice changes the state for which it is the system of record, and then signals to subscribers via an event that it has changed its state, how do we ensure…","breadcrumbs":[{"label":"Event Driven Architectures"}]},{"id":"A8JpcykRypJkd8kO2xBA","title":"Using a Task Queue","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/task-queues/taskqueuepattern","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). The Task Queue Pattern let's you use an External Bus to handle work asynchronously.","breadcrumbs":[{"label":"Task Queues"}]},{"id":"AHs30YRMpJp2SB6ernbC","title":"FAQ","pathname":"/paramore-brighter-documentation/v9-paramore-brighter-documentation/faq/faq","siteSpaceId":"sitesp_c1xBf","description":"Brighter V9 (superseded). When should you use an asynchronous pipeline to handle work and when should you use an External Bus.","breadcrumbs":[{"label":"FAQ"}]}]}