11<h1 align =" center " >SquidStd.Messaging</h1 >
22
3- In-memory transport for SquidStd.Messaging. Provides a channel-backed ` IQueueProvider ` with per-queue
4- buffering, round-robin delivery to subscribers, retry/dead-letter handling, and metrics - registered
5- with a single ` AddInMemoryMessaging() ` call. Ideal for single-process apps, tests, and local dev.
3+ In-memory transport for SquidStd.Messaging. Provides channel-backed ` IQueueProvider ` and ` ITopicProvider `
4+ implementations behind the shared ` IMessageQueue ` / ` IMessageTopic ` facades: per-queue buffering,
5+ round-robin (competing-consumers) delivery, retry and dead-letter handling, topic fan-out, and metrics -
6+ all registered with a single ` AddInMemoryMessaging() ` call.
7+
8+ Queues deliver each message to exactly one subscriber; topics fan every message out to all subscribers.
9+ The contracts live in ` SquidStd.Messaging.Abstractions ` , so code written against ` IMessageQueue ` and
10+ ` IMessageTopic ` moves unchanged to a real broker: use this in-memory provider for single-process apps,
11+ tests, and local dev, then swap in ` SquidStd.Messaging.RabbitMq ` or ` SquidStd.Messaging.Sqs ` for
12+ production.
613
714## Install
815
@@ -12,28 +19,108 @@ dotnet add package SquidStd.Messaging
1219
1320## Usage
1421
22+ Register through the bootstrap - the providers are ` ISquidStdService ` s, so ` StartAsync ` / ` StopAsync `
23+ manage their lifecycle for you:
24+
1525``` csharp
16- using DryIoc ;
1726using SquidStd .Messaging .Abstractions .Interfaces ;
1827using SquidStd .Messaging .Extensions ;
28+ using SquidStd .Services .Core .Extensions ;
29+ using SquidStd .Services .Core .Services .Bootstrap ;
30+
31+ var bootstrap = SquidStdBootstrap .Create (o => o .ConfigName = " myapp" );
32+ bootstrap .ConfigureServices (c => c .RegisterCoreServices ().AddInMemoryMessaging ());
33+ await bootstrap .StartAsync ();
34+ ```
35+
36+ ### Queues (competing consumers)
37+
38+ Each queue message goes to exactly one subscriber. Implement a listener and subscribe it; dispose the
39+ subscription to unsubscribe.
40+
41+ ``` csharp
42+ public sealed record OrderPlaced (string Id );
43+
44+ public sealed class OrderListener : IQueueMessageListenerAsync <OrderPlaced >
45+ {
46+ public Task HandleAsync (OrderPlaced message , CancellationToken cancellationToken )
47+ {
48+ Console .WriteLine ($" queue handled {message .Id }" );
49+ return Task .CompletedTask ;
50+ }
51+ }
52+
53+ var queue = bootstrap .Resolve <IMessageQueue >();
54+
55+ using (queue .Subscribe (" orders" , new OrderListener ()))
56+ {
57+ await queue .PublishAsync (" orders" , new OrderPlaced (" order-1" ));
58+ }
59+ ```
1960
20- var container = new Container ();
21- container .AddInMemoryMessaging ();
61+ A synchronous ` IQueueMessageListener<TMessage> ` overload of ` Subscribe ` is also available.
2262
23- var queue = container .Resolve <IMessageQueue >();
24- await queue .PublishAsync (" orders" , new { Id = 1 });
63+ ### Topics (fan-out)
64+
65+ Every subscriber receives every message published to the topic.
66+
67+ ``` csharp
68+ var topic = bootstrap .Resolve <IMessageTopic >();
69+
70+ using (topic .Subscribe <OrderPlaced >(" order-events" , (order , _ ) =>
71+ {
72+ Console .WriteLine ($" topic saw {order .Id }" );
73+ return Task .CompletedTask ;
74+ }))
75+ {
76+ await topic .PublishAsync (" order-events" , new OrderPlaced (" order-2" ));
77+ }
78+ ```
79+
80+ ## Configuration
81+
82+ ` AddInMemoryMessaging ` takes an optional ` MessagingOptions ` . Options are code-only - this package
83+ registers no YAML config section.
84+
85+ ``` csharp
86+ c .AddInMemoryMessaging (new MessagingOptions
87+ {
88+ MaxDeliveryAttempts = 5 ,
89+ DeadLetterQueueSuffix = " .dead" ,
90+ RetryDelay = TimeSpan .FromMilliseconds (250 )
91+ });
2592```
2693
94+ | Property | Default | Purpose |
95+ | -------------------------| ---------| -------------------------------------------------------------|
96+ | ` MaxDeliveryAttempts ` | ` 3 ` | Delivery attempts before a message is dead-lettered. |
97+ | ` DeadLetterQueueSuffix ` | ` ".dlq" ` | Suffix appended to a queue name to form its dead-letter queue. |
98+ | ` RetryDelay ` | ` Zero ` | Delay before a failed message is re-enqueued. |
99+
100+ A connection-string overload is also available:
101+ ` AddInMemoryMessaging("memory://local?maxDeliveryAttempts=5&retryDelayMs=250&deadLetterSuffix=.dead") ` .
102+
103+ When a listener throws, the message is re-enqueued (after ` RetryDelay ` ) until ` MaxDeliveryAttempts ` is
104+ reached, then moved to ` <queue><DeadLetterQueueSuffix> ` - subscribe to that queue to inspect failures.
105+ ` MessagingMetricsProvider ` is registered as ` IMessagingMetrics ` / ` IMetricProvider ` and tracks published,
106+ delivered, retried, failed, and dead-lettered counts per queue.
107+
27108## Key types
28109
29- | Type | Purpose |
30- | -----------------------------------| -------------------------------------------|
31- | ` MessagingRegistrationExtensions ` | ` AddInMemoryMessaging(...) ` registration. |
32- | ` InMemoryQueueProvider ` | Channel-based in-memory ` IQueueProvider ` . |
110+ | Type | Purpose |
111+ | -----------------------------------| ------------------------------------------------------------|
112+ | ` MessagingRegistrationExtensions ` | ` AddInMemoryMessaging(...) ` registration. |
113+ | ` InMemoryQueueProvider ` | Channel-based in-memory ` IQueueProvider ` with retry/DLQ. |
114+ | ` InMemoryTopicProvider ` | In-memory ` ITopicProvider ` (fan-out). |
115+ | ` IMessageQueue ` / ` IMessageTopic ` | Typed facades from ` SquidStd.Messaging.Abstractions ` . |
116+ | ` MessagingOptions ` | Retry, dead-letter, and delivery-attempt configuration. |
33117
34118## Related
35119
120+ - Article: [ Messaging] ( https://tgiachi.github.io/squid-std/articles/messaging.html )
121+ - Article: [ Messaging abstractions] ( https://tgiachi.github.io/squid-std/articles/messaging-abstractions.html )
36122- Tutorial: [ Messaging] ( https://tgiachi.github.io/squid-std/tutorials/messaging.html )
123+ - Production transports: [ SquidStd.Messaging.RabbitMq] ( https://tgiachi.github.io/squid-std/articles/messaging-rabbitmq.html ) , [ SquidStd.Messaging.Sqs] ( https://tgiachi.github.io/squid-std/articles/messaging-sqs.html )
37124
38125## License
39126
0 commit comments