Glossary

This glossary provides definitions for key terms used in Brighter and Darker. Terms are organized by category for easy navigation.

Core Concepts

Request

A message sent over a bus. The base type for Commands, Events, and Queries. A Request represents an instruction or notification that needs to be processed by a handler.

See: Implementing Command, Events and Queries

Command

An instruction to execute some behavior that may update state. Commands are imperative - they tell the system to do something. A command should have one handler.

Example: AddGreeting, DeletePerson, UpdateOrder

See: Basic Configuration

Event

A notification that something has happened. Events are facts about the past. Multiple handlers can subscribe to an event. Events do not update state directly - they inform interested parties about state changes that have already occurred.

Example: GreetingMade, PersonDeleted, OrderPlaced

See: Publishing Events

Query

A request for data that does not update state. Queries are processed by the Query Processor (Darker). A query returns a Result.

Example: FindGreetingsForPerson, GetOrderById, SearchProducts

See: Darker documentation

Processors

Command Processor

The component that sends and publishes Commands and Events. The Command Processor provides middleware functionality like retry, logging, and timeouts through a pipeline. It separates the sender from the receiver.

Interface: IAmACommandProcessor

See: How the Command Processor Works

Query Processor

The component that executes Queries and returns Results. The Query Processor provides middleware functionality similar to the Command Processor. Part of Darker.

Interface: IAmAQueryProcessor

See: Darker documentation

Brighter and Darker

Brighter

The framework for Commands and Events - messages that may update state. Brighter provides both in-process and out-of-process messaging capabilities.

See: Show me the code!

Darker

The framework for Queries - messages that return data without updating state. Darker follows the same patterns as Brighter but is optimized for query scenarios.

See: Darker documentation

Dispatcher

Dispatcher

The component that listens for messages from external middleware (like RabbitMQ or Kafka) and dispatches them to handlers. The Dispatcher is the runtime component that processes messages from a queue or topic.

Note: The assembly name is Paramore.Brighter.ServiceActivator, but the concept and class are referred to as "Dispatcher" throughout the documentation.

See: How the Dispatcher Works

Consumer

A Dispatcher that listens to external messages from middleware and forwards them to handlers. Configured using subscriptions.

See: Configuring the Dispatcher

ServiceActivator

The assembly name for the Dispatcher component (Paramore.Brighter.ServiceActivator). When referring to the concept or runtime behavior, use "Dispatcher" instead.

Handler & Pipeline

Handler

A class that processes a Request (Command, Event, or Query). Handlers contain the business logic for responding to requests.

Interface: IHandleRequests<T> (synchronous) or IHandleRequestsAsync<T> (asynchronous)

See: Implementing a Handler

Request Handler

The specific interface for handling requests. Handlers derive from RequestHandler<T> or RequestHandlerAsync<T>.

See: Request Handlers and Pipelines

Pipeline

A chain of handlers with middleware that processes a request. The pipeline allows you to compose cross-cutting concerns (logging, retry, validation) around your business logic.

See: Building a Pipeline

Middleware

A handler that wraps other handlers to provide cross-cutting functionality. Middleware handlers run before and/or after the main handler. Common middleware includes logging, retry, timeout, and validation.

Examples: RequestLoggingAsync, UseResiliencePipeline, UseInboxAsync

See: Building a Pipeline

Patterns

Outbox

A pattern for ensuring that messages are sent reliably. The Outbox writes messages to a database in the same transaction as entity changes, guaranteeing that both succeed or fail together. Messages are then dispatched from the Outbox to the message broker.

See: Outbox Pattern, Outbox Support

Inbox

A pattern for deduplication - ensuring that a message is only processed once. The Inbox tracks which messages have been processed and prevents duplicate processing of the same message.

See: Inbox Configuration

Sweeper

A background process that monitors an Outbox and dispatches messages that have not yet been sent. The Sweeper provides guaranteed, at-least-once delivery by continuously attempting to send messages until they succeed.

See: Outbox Support

Claim Check

A pattern for handling large messages. Instead of sending the entire message through the broker, the large payload is stored externally (e.g., in S3 or blob storage), and only a reference (claim check) is sent in the message. The receiver retrieves the payload using the claim check.

See: Default Message Mappers, S3 Luggage Store

Messaging

Producer

A component that sends messages to external middleware. Configured using publications.

See: Configuring Producers

Subscription

Configuration for a Consumer that defines how to receive messages from a specific topic or queue. Includes message pump configuration, routing keys, and other transport-specific settings.

See: RabbitMQ Configuration, Kafka Configuration

Publication

Configuration for a Producer that defines how to send messages to a specific topic or queue. Maps message types to routing keys and topics.

See: Basic Configuration

Message Mapper

A component that converts between Requests (C# objects) and Messages (wire format). Message Mappers handle serialization, deserialization, and header mapping.

Interface: IAmAMessageMapper<T>

Note: In V10, explicit message mappers are often not needed - default JSON mappers are used automatically.

See: Message Mappers, Default Message Mappers

Transform

A message transformation applied in a pipeline. Transforms can compress, encrypt, or apply other transformations to messages. Used with attributes like [ClaimCheck], [Compression], [Encryption].

See: Default Message Mappers

Message

The wire format representation of a Request. Contains headers (metadata) and body (payload). Messages are transported over middleware like RabbitMQ, Kafka, or AWS SQS.

Class: Message

See: Message Mappers

Routing

Routing Key

The destination identifier for a message. In RabbitMQ, this is the routing key. In Kafka, this is the topic. The routing key determines where messages are sent.

See: RabbitMQ Configuration

Topic

A message category or channel. In pub-sub systems, publishers send to topics, and subscribers listen to topics. In Kafka, topics are first-class constructs. In RabbitMQ, topics are implemented using exchanges and routing keys.

See: Kafka Configuration

CloudEvents Type

The message type identifier in the CloudEvents specification. Used for message routing and type resolution in dynamic deserialization scenarios. Format: reverse DNS notation (e.g., io.goparamore.task.created).

See: CloudEvents Support, Dynamic Message Deserialization

DataType Channel

The default routing pattern in Brighter - one message type per channel. Each channel (topic/queue) carries only one type of message, so the channel name determines the message type.

See: Dynamic Message Deserialization

Agreement Dispatcher

A pattern for dynamic handler selection based on request content or context. Instead of a 1-to-1 mapping between request type and handler, Agreement Dispatcher allows runtime selection of which handler(s) should process a request.

Named after Martin Fowler's Agreement Dispatcher pattern.

See: Agreement Dispatcher

Concurrency

Reactor

A concurrency pattern using blocking I/O. The Reactor pattern processes messages synchronously, which provides faster performance per message (no context switch overhead) but may limit throughput under high load.

Configured with: MessagePumpType.Reactor

See: Reactor and Proactor

Proactor

A concurrency pattern using non-blocking I/O. The Proactor pattern processes messages asynchronously with ConfigureAwait(false), which provides better throughput (yields threads during I/O) but adds context switch overhead.

Configured with: MessagePumpType.Proactor

See: Reactor and Proactor

Performer

The message pump - a single-threaded component that pulls messages from middleware and dispatches them to handlers. The Performer can operate in either Reactor or Proactor mode.

Note: In earlier versions, this was called "Message Pump". Current terminology uses "Performer" for the single-threaded pump.

See: Reactor and Proactor

Message Pump

The component that retrieves messages from a transport and dispatches them to handlers. Runs on a single thread (the Performer). Can operate in Reactor mode (blocking) or Proactor mode (non-blocking).

See: How the Dispatcher Works

Resilience

Resilience Pipeline

A Polly v8 pipeline that provides resilience strategies like retry, circuit breaker, timeout, rate limiter, fallback, and hedging. Resilience pipelines replace the legacy UsePolicy attributes in V10.

Configured with: [UseResiliencePipeline] attribute

See: Resilience Pipelines

Circuit Breaker

A resilience pattern that prevents cascading failures. When a certain threshold of failures is reached, the circuit breaker "opens" and stops sending requests to the failing service. After a cooldown period, it enters a "half-open" state to test if the service has recovered.

See: Resilience Pipelines

Retry

A resilience pattern that automatically retries failed operations. Retry policies can use fixed delays, exponential backoff, or jitter to space out retry attempts.

See: Resilience Pipelines

Fallback

A resilience pattern that provides alternative behavior when an operation fails. Fallback can return default values, compensate for failures, queue work for later, or raise alerts.

See: Fallback Policy

Timeout

A resilience pattern that limits how long an operation can run. Timeouts prevent operations from hanging indefinitely and consuming resources.

Note: TimeoutPolicy is deprecated in V10. Use Resilience Pipelines with timeout strategy instead.

See: Resilience Pipelines

Sweeper Circuit Breaking

A pattern for preventing failures when posting to one topic from blocking posting to other topics. The sweeper tracks failures per topic and "trips" a circuit breaker for problematic topics, allowing healthy topics to continue operating.

See: Sweeper Circuit Breaking

CloudEvents

CloudEvents

A CNCF specification for describing event data in a common format. CloudEvents provides interoperability between different messaging systems and frameworks.

Specification: CloudEvents v1.0.2

See: CloudEvents Support

Binary-mode CloudEvents

A CloudEvents encoding where attributes are stored in protocol headers and the event data is the message body. Recommended when the protocol supports rich headers (e.g., AMQP, Kafka, RabbitMQ).

See: CloudEvents Support

Structured-mode CloudEvents

A CloudEvents encoding where the entire event (attributes + data) is stored in the message body as JSON. Recommended when the protocol has limited header support (e.g., AWS SNS/SQS).

See: CloudEvents Support

Context

Request Context

An object that carries contextual information through the handler pipeline. Provides access to headers, partition keys, telemetry spans, resilience context, and the originating message.

Interface: IRequestContext

See: Using the Context Bag, Request Context Improvements

Context Bag

A key-value store within the Request Context for passing custom data between handlers in a pipeline. Use well-known keys from RequestContextBagNames for standard values.

See: Using the Context Bag

Originating Message

The original wire-format Message that triggered a handler (available in Consumers). Accessible via Context.OriginatingMessage. Useful for debugging, auditing, and accessing transport-specific metadata.

See: Request Context Improvements

Partition Key

A value used to determine which partition a message should be routed to in partitioned systems like Kafka. Ensures messages with the same key go to the same partition, maintaining order.

See: Request Context Improvements

Scheduling

Scheduler

A component that handles delayed message delivery. Schedulers allow you to send messages at a future time or after a delay.

See: Scheduler Support

InMemory Scheduler

A timer-based scheduler that stores scheduled work in memory. Suitable for development and testing, but not durable - crashes lose scheduled messages.

See: InMemory Scheduler

Quartz Scheduler

A production scheduler using Quartz.NET. Provides persistent, distributed scheduling with clustering support.

See: Quartz Scheduler

Hangfire Scheduler

A production scheduler using Hangfire. Provides persistent scheduling with a web dashboard for monitoring.

See: Hangfire Scheduler

AWS Scheduler

A serverless scheduler using AWS EventBridge Scheduler. Cloud-native option for AWS deployments.

See: AWS Scheduler

Azure Scheduler

A scheduler using Azure Service Bus native scheduling features. Cloud-native option for Azure deployments. Does not support rescheduling - must cancel and create a new schedule.

See: Azure Scheduler

Telemetry

OpenTelemetry (OTel)

An observability framework for collecting traces, metrics, and logs. Brighter V10 uses OpenTelemetry Semantic Conventions for messaging.

See: Telemetry

Activity

The .NET implementation of an OpenTelemetry Span. Represents a unit of work in a distributed trace.

See: Telemetry

Span

A unit of work in a distributed trace. Spans have a start time, duration, and attributes. Spans can be nested to form a trace hierarchy.

See: Telemetry

W3C TraceContext

A W3C standard for propagating trace context between services. Uses traceparent and tracestate headers.

Specification: W3C Trace Context

See: Telemetry

Transports

Transport

The middleware used to send messages between processes. Examples: RabbitMQ, Kafka, AWS SNS/SQS, Azure Service Bus, Redis, MSSQL.

See: Transport-specific configuration pages

InMemory Transport

An in-process transport for development and testing. Messages are stored in memory and delivered within the same process. Not durable - crashes lose messages.

See: InMemory Options

External Bus

Middleware such as RabbitMQ or Kafka used to send messages between processes. Contrasted with the Internal Bus (in-process).

See: Show me the code!

Internal Bus

In-process message delivery without external middleware. Useful for decoupling components within a single application.

See: Basic Configuration

Other Terms

Nullable Reference Types

DepositPost

A method that writes a message to the Outbox within a database transaction. Used for transactional messaging - guarantees that entity writes and message writes succeed or fail together.

See: Outbox Support

ClearOutbox

A method that dispatches messages from the Outbox to the message broker. Can be called explicitly (low latency) or handled by a Sweeper (automatic retry).

See: Outbox Support

Post

A method that writes a message to the Outbox and immediately attempts to dispatch it. Does not participate in database transactions. Suitable for scenarios where you don't need transactional guarantees.

See: Outbox Support

Dynamic Deserialization

A technique for handling multiple message types on a single channel. Uses a callback (getRequestType) to determine the message type at runtime, typically based on CloudEvents type or message headers.

See: Dynamic Message Deserialization

Industry Standard Terms (EIP)

Brighter and Darker implement many patterns from Enterprise Integration Patterns by Gregor Hohpe and Bobby Woolf:

  • Command Processor = Command pattern + Chain of Responsibility

  • Dispatcher = Message Endpoint + Competing Consumers

  • Outbox = Transactional Outbox pattern

  • Claim Check = Claim Check pattern

  • Message Mapper = Message Translator

  • Pipeline = Pipes and Filters

  • Sweeper = Polling Consumer + Message Store

  • Agreement Dispatcher = Content-Based Router


See Also

Last updated

Was this helpful?