Oragon.RabbitMQ.AspireClient
0.0.9-beta
Prefix Reserved
dotnet add package Oragon.RabbitMQ.AspireClient --version 0.0.9-beta
NuGet\Install-Package Oragon.RabbitMQ.AspireClient -Version 0.0.9-beta
<PackageReference Include="Oragon.RabbitMQ.AspireClient" Version="0.0.9-beta" />
paket add Oragon.RabbitMQ.AspireClient --version 0.0.9-beta
#r "nuget: Oragon.RabbitMQ.AspireClient, 0.0.9-beta"
// Install Oragon.RabbitMQ.AspireClient as a Cake Addin #addin nuget:?package=Oragon.RabbitMQ.AspireClient&version=0.0.9-beta&prerelease // Install Oragon.RabbitMQ.AspireClient as a Cake Tool #tool nuget:?package=Oragon.RabbitMQ.AspireClient&version=0.0.9-beta&prerelease
Oragon.RabbitMQ
Official Release
Others
Tech / Skill
Opinionated and Simplified Minimal APIs for Consuming Messages from RabbitMQ, Ensuring No Crucial Configurations Are Hidden.
What is Oragon.RabbitMQ?
Oragon.RabbitMQ provides everything you need to create resilient RabbitMQ consumers without the need to study numerous books and articles or introduce unknown risks to your environment.
If you have a service like this
public class BusinessService
{
public async Task DoSomethingAsync(BusinessCommandOrEvent commandOrEvent)
{
... business core ...
}
}
You will create a RabbitMQ Consumers with this
Singleton
builder.Services.AddSingleton<BusinessService>();
builder.Services.AddSingleton<IAMQPSerializer>(sp => new SystemTextJsonAMQPSerializer(new System.Text.Json.JsonSerializerOptions(System.Text.Json.JsonSerializerDefaults.General){ ... }));
builder.Services.MapQueue<BusinessService, BusinessCommandOrEvent>(config => config
.WithDispatchInRootScope()
.WithAdapter((svc, msg) => svc.DoSomethingAsync(msg))
.WithQueueName("events")
.WithPrefetchCount(1)
);
Scoped
builder.Services.AddScoped<BusinessService>();
builder.Services.AddSingleton<IAMQPSerializer>(sp => new SystemTextJsonAMQPSerializer(new System.Text.Json.JsonSerializerOptions(System.Text.Json.JsonSerializerDefaults.General){ ... }));
builder.Services.MapQueue<BusinessService, BusinessCommandOrEvent>(config => config
.WithDispatchInChildScope()
.WithAdapter((svc, msg) => svc.DoSomethingAsync(msg))
.WithQueueName("events")
.WithPrefetchCount(1)
);
Scoped and Keyed Services, Same Type, Multiple Consumers, Using NewtonsoftAMQPSerializer
builder.Services.AddKeyedScoped<BusinessService>("key-of-service-1");
builder.Services.AddKeyedScoped("key-of-service-2", (sp, key) => new BusinessService(... custom dependencies ...));
builder.Services.AddSingleton<IAMQPSerializer>(sp => new NewtonsoftAMQPSerializer(new Newtonsoft.Json.JsonSerializerSettings(){ ... }));
builder.Services.MapQueue<BusinessService, BusinessCommandOrEvent>(config => config
.WithDispatchInChildScope()
.WithKeyedService("key-of-service-1")
.WithAdapter((svc, msg) => svc.DoSomethingAsync(msg))
.WithQueueName("events1")
.WithPrefetchCount(1)
);
builder.Services.MapQueue<BusinessService, BusinessCommandOrEvent>(config => config
.WithDispatchInChildScope()
.WithKeyedService("key-of-service-2")
.WithAdapter((svc, msg) => svc.DoSomethingAsync(msg))
.WithQueueName("events2")
.WithPrefetchCount(1)
);
Concepts
Decoupling Business Logic from Infrastructure
This approach is designed to decouple RabbitMQ consumers from business logic, ensuring that business code remains unaware of the queue consumption context.
The result is incredibly simple, decoupled, agnostic, more reusable, and highly testable code.
Opinionated Design: Why?
This consumer is focused on creating a resilient consumer using manual acknowledgments.
- The flow produces a
BasicReject
without requeue for serialization failures (e.g., incorrectly formatted messages), you will use dead-lettering to ensure these messages are not lost. - The flow produces a
BasicNack
with requeue for processing failures, allowing for message reprocessing. - Minimal API design style made without reflection
- Extensible with support for custom serializers and encoders
RabbitMQ Tracing com OpenTelemetry
Full support for OpenTelemetry on publishing or consuming RabbitMQ messages.
<img src="./docs/playground.gif">
Refactored to use RabbitMQ.Client 7x (with IChannel instead IModel)
Stages and Requirements for Launch
- Migrate Demo to Library Project
- Core: Queue Consumer
- Core: Rpc Queue Consumer
- Core: Support Keyed Services
- Core: Support of new design of RabbitMQ.Client
- Create Samples
- Review All SuppressMessageAttribute
- Create Docs
- Benchmarks
- Automate Badges
- Add SonarCloud
- Code Coverage > 80%
- Add CI/CD
- Add Unit Tests
- Add Integrated Tests with TestContainers
- Test CI/CD Flow: MyGet Alpha Packages with Symbols
- Test CI/CD Flow: MyGet Packages without Symbols
- Test CI/CD Flow: Nuget Packages without Symbols
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net8.0 is compatible. 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. |
-
net8.0
- AspNetCore.HealthChecks.Rabbitmq (>= 8.0.2)
- Dawn.Guard (>= 1.12.0)
- Microsoft.Extensions.Configuration.Binder (>= 9.0.0-preview.7.24405.7)
- Microsoft.Extensions.Hosting.Abstractions (>= 9.0.0-preview.7.24405.7)
- OpenTelemetry.Extensions.Hosting (>= 1.9.0)
- Polly.Core (>= 8.4.2)
- RabbitMQ.Client (>= 7.0.0-rc.8)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
0.0.9-beta | 66 | 10/19/2024 |