Lyo.MessageQueue
3.0.0
dotnet add package Lyo.MessageQueue --version 3.0.0
NuGet\Install-Package Lyo.MessageQueue -Version 3.0.0
<PackageReference Include="Lyo.MessageQueue" Version="3.0.0" />
<PackageVersion Include="Lyo.MessageQueue" Version="3.0.0" />
<PackageReference Include="Lyo.MessageQueue" />
paket add Lyo.MessageQueue --version 3.0.0
#r "nuget: Lyo.MessageQueue, 3.0.0"
#:package Lyo.MessageQueue@3.0.0
#addin nuget:?package=Lyo.MessageQueue&version=3.0.0
#tool nuget:?package=Lyo.MessageQueue&version=3.0.0
Lyo.MessageQueue
IMqService defines the queue and exchange contract. Schedulers, workers, and gateways compile against one interface and swap RabbitMQ or later brokers behind Lyo.MessageQueue.*
implementations.
Implements Lyo.Health.IHealth so dashboards can ping broker connectivity alongside DB/cache checks.
IMqService
ConnectAsync/DisconnectAsyncopen and close a session.IsConnectedis a synchronous snapshot used as a guard.CreateQueue/CreateExchangedeclare topology. Brokers treat matching re-declares as no-ops.
Message envelopes (QueueMessageEnvelope<T>)
QueueMessageEnvelope<T> holds Payload, RequeueCount, MessageId, EnqueuedAt, TraceId, and
Version alongside the payload. The internal QueueWorkerHelpers.DeserializeMessage<T> detects JSON
shaped like { Payload, RequeueCount, … }. Bare DTO JSON is not accepted.
- Attach
RequeueCount/ identifiers / timestamps without wrapping every caller manually.
MessageProcessingExceptionHandling (IgnoreAndRemoveFromQueue, ThrowAndRemoveFromQueue,
RequeueOnException) is the shared enum implementations expose for tuning how thrown exceptions in
message handlers map onto ack/nack/requeue.
QueueWorkerBase
- Implements
IHostedService+IDisposable+IHealth.StartAsyncconnects when needed and callsSubscribeToQueue.StopAsynccancels, then waits up toDrainTimeoutMs(default30_000ms) for in-flight messages, then returns. - Parses messages with the envelope-aware
DeserializeMessagehelper. - Executes your abstract
DoWorkAsync(TRequest, CancellationToken) → Task<TResult>. - Applies requeue heuristics: an optional
Metadata["requeue"]bool on the result overrides the default!IsSuccessrequeue rule. - Supports
maxRequeueCount+ optional DLQ publish (dlqName); when the count is exceeded, original message bytes go to the DLQ if one is configured; otherwise the message is dropped at Error level. - Optional retry backoff through the public
RequeueDelayproperty: when set and the transport implementsIDelayedMqService, each counted requeue is republished with a broker-side delay ofRequeueDelay × attempt(linear backoff), so a failing message cannot burn through its retry budget in milliseconds. Transports without delay support republish immediately.
Retry path for envelopes
Each failure path acks the original delivery and republishes a counted copy. A bad message or a
repeatedly-throwing DoWorkAsync cannot loop forever on broker redelivery:
flowchart LR
msg[Message delivered] --> des{Deserialize\nautocorrect ladder}
des -->|unrecoverable| poison[Ack + forward original bytes to DLQ]
des -->|ok| work[DoWorkAsync]
work -->|success| ack[Ack]
work -->|failure / exception| cap{RequeueCount < max?}
cap -->|yes| requeue["Ack + republish with RequeueCount+1\n(delayed by RequeueDelay × attempt when supported)"]
requeue --> msg
cap -->|no| dlq[Ack + route to DLQ or drop]
QueueWorkerOptions
Shared defaults come from DI registration paths (for example AddJobWorker / AddJobWorkerFromConfiguration,
section name "QueueWorkerOptions"). The QueueWorkerBase constructor signature is unchanged:
| Property | Type | Default | Purpose |
|---|---|---|---|
DefaultMaxRequeueCount |
int? |
5 |
Requeue cap applied when a worker doesn't pass an explicit maxRequeueCount. null means unlimited retries. |
RequeueDelay |
TimeSpan? |
2s |
Base retry delay (linear backoff by attempt). Needs an IDelayedMqService transport; null/zero means no delay. |
- Tracks
InFlightCount, publishes aqueue-worker:{QueueName}health probe viaCheckHealthAsync, and emits metrics via the injectedIMetrics:queue.worker.message.processing.duration(timer; tagqueue)queue.worker.messages.received/processed/requeued/deserialization.failed/dropped.max_requeue/dlqqueue.worker.started/start.failed/stoppedqueue.worker.running(gauge;1while running,0after stop)- Error records on
queue.worker.message.processing.errorandqueue.worker.message.deserialization.error
Lyo job and email workers use this hosted-consumer path.
Health and diagnostics data
MqServiceHealth.QueuesandConnectionscollections.MessageQueueInfo(Name, State?, Type?, Messages, MessagesReady, MessagesUnacknowledged, Consumers, AdditionalProperties). Snapshot of one queue. AMQP declare flags (durable,exclusive,auto_delete) andx-*arguments are RabbitMQ-only and sit inAdditionalProperties.MessageExchangeInfo(Name, Type?, Durable, AutoDelete, Internal, AdditionalProperties). Per-exchange snapshot.ConnectionInfo(User, UserProvidedName?, State, VHost). Snapshot of a connection.QueuePeekMessage(Payload, PayloadEncoding?, Exchange?, RoutingKey?, MessageCount?, Redelivered). Returned byPeekQueueMessages.
Operations
- Treat
byte[]as opaque on the interface. Sign and compress at the app layer when payloads leave a trust zone. - Idempotency. Requeue storms show up when handlers throw. Keep side effects idempotent or persist processing tokens.
- Health. Implementors should make
IHealthreport broker reachability. Do not report healthy whileIsConnected()is false unless you want a lazy connect.
Implementations and UI
| Package | Role |
|---|---|
Lyo.MessageQueue.RabbitMq |
RabbitMQ.Client driver plus DI helpers. |
Lyo.MessageQueue.Web.Components |
Blazor UI for inspecting and managing queues in internal tools. |
Lyo.MessageQueue.RabbitMq.Web.Components |
Rabbit-specific components and registration. |
Related
Lyo.Job.Scheduler. Often paired with queues for fan-out triggers.Lyo.Health. Shared health reporting.
Dependencies
Generated from ProjectReference / PackageReference (same model as docs/Lyo.ProjectGraph.html).
Lyo.Exceptions(direct, lyo)Lyo.Health(direct, lyo)Lyo.Json(direct, lyo)Lyo.Metrics(direct, lyo)Lyo.Result(direct, lyo)Microsoft.Extensions.Hosting.Abstractions10.0.5(direct, microsoft)Lyo.Common.Core(transitive, lyo)Lyo.DataTable.Models(transitive, lyo)Microsoft.Bcl.AsyncInterfaces10.0.5(transitive, microsoft, netstandard2.0)System.Memory4.6.3(transitive, microsoft, netstandard2.0)System.Text.Encoding.CodePages10.0.5(transitive, microsoft)System.Text.Json10.0.5(transitive, microsoft, netstandard2.0)
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Lyo.Exceptions (>= 3.0.0)
- Lyo.Health (>= 3.0.0)
- Lyo.Json (>= 3.0.0)
- Lyo.Metrics (>= 3.0.0)
- Lyo.Result (>= 3.0.0)
- Microsoft.Extensions.Hosting.Abstractions (>= 10.0.5)
-
net10.0
- Lyo.Exceptions (>= 3.0.0)
- Lyo.Health (>= 3.0.0)
- Lyo.Json (>= 3.0.0)
- Lyo.Metrics (>= 3.0.0)
- Lyo.Result (>= 3.0.0)
- Microsoft.Extensions.Hosting.Abstractions (>= 10.0.5)
NuGet packages (10)
Showing the top 5 NuGet packages that depend on Lyo.MessageQueue:
| Package | Downloads |
|---|---|
|
Lyo.MessageQueue.RabbitMq
RabbitMQ implementation of the Lyo MessageQueue service for asynchronous messaging. |
|
|
Lyo.MessageQueue.Web.Components
Reusable Blazor components for provider-neutral message queue dashboards and workbenches. |
|
|
Lyo.Job.Client
HTTP client for the Lyo Job API and IMqService-backed job event publisher for scheduler/worker hosts. |
|
|
Lyo.Job.Postgres
PostgreSQL persistence for Lyo job management with EF Core, optional auto-migrations, and RabbitMQ event publishing. |
|
|
Lyo.Job.Worker
Worker SDK for the Lyo job system. Provides a base class that handles job lifecycle (fetch, start, execute, finish, cancellation) so workers only implement ExecuteAsync. |
GitHub repositories
This package is not used by any popular GitHub repositories.