CodeDesignPlus.Net.ServiceBus
1.0.0-beta.13054
dotnet add package CodeDesignPlus.Net.ServiceBus --version 1.0.0-beta.13054
NuGet\Install-Package CodeDesignPlus.Net.ServiceBus -Version 1.0.0-beta.13054
<PackageReference Include="CodeDesignPlus.Net.ServiceBus" Version="1.0.0-beta.13054" />
<PackageVersion Include="CodeDesignPlus.Net.ServiceBus" Version="1.0.0-beta.13054" />
<PackageReference Include="CodeDesignPlus.Net.ServiceBus" />
paket add CodeDesignPlus.Net.ServiceBus --version 1.0.0-beta.13054
#r "nuget: CodeDesignPlus.Net.ServiceBus, 1.0.0-beta.13054"
#:package CodeDesignPlus.Net.ServiceBus@1.0.0-beta.13054
#addin nuget:?package=CodeDesignPlus.Net.ServiceBus&version=1.0.0-beta.13054&prerelease
#tool nuget:?package=CodeDesignPlus.Net.ServiceBus&version=1.0.0-beta.13054&prerelease
CodeDesignPlus.Net.ServiceBus
Description
CodeDesignPlus.Net.ServiceBus implementa el contrato de publicación y suscripción del SDK sobre Azure Service Bus. Es un transporte alternativo a CodeDesignPlus.Net.RabbitMQ: los handlers, los eventos de dominio y los atributos EventKey y QueueName no cambian, solo cambia por dónde viajan los mensajes.
Tabla de contenido
- Sobre el proyecto
- Cómo se traduce el modelo de RabbitMQ
- Instalación
- Uso
- Autenticación
- Reintentos y dead-letter
- Pruebas
- Límites que conviene conocer
- Contributing
- License
- Contact
Sobre el proyecto
La librería implementa IMessage de CodeDesignPlus.Net.PubSub. Todo lo que rodea al transporte —el descubrimiento de handlers, los servicios en segundo plano que abren las suscripciones, el seguimiento de cuáles están listas y la cola en memoria opcional— lo sigue aportando CodeDesignPlus.Net.PubSub sin cambios.
Cómo se traduce el modelo de RabbitMQ
| RabbitMQ | Azure Service Bus |
|---|---|
Exchange fanout por tipo de evento |
Topic, con el mismo nombre derivado de EventKey |
| Una cola por handler, enlazada al exchange | Una suscripción por handler |
Exchange y cola .dlx declarados a mano |
DLQ nativa, <topic>/Subscriptions/<sub>/$DeadLetterQueue |
x-delivery-limit |
MaxDeliveryCount |
x-message-ttl |
DefaultMessageTimeToLive |
BasicAck / BasicNack |
CompleteMessageAsync / AbandonMessageAsync / DeadLetterMessageAsync |
Cabecera x-delivery-count |
ServiceBusReceivedMessage.DeliveryCount |
El nombre del topic es el mismo que el del exchange, así que el inventario de eventos no cambia. El nombre de la suscripción sí: Azure lo limita a 50 caracteres y casi todos los nombres de cola actuales los superan. La librería lo resuelve sola, sin tocar los [QueueName]:
subscription = "{appName}.{action}" si cabe en 50
= prefijo[41] + "-" + sha256(logico)[8] si no cabe
El resumen se calcula sobre el nombre lógico completo (negocio, versión y entidad incluidos), de modo que dos handlers cuyo prefijo coincide tras el recorte siguen resolviendo a suscripciones distintas.
Instalación
dotnet add package CodeDesignPlus.Net.ServiceBus
Uso
builder.Services.AddServiceBus<Program>(builder.Configuration);
{
"Core": { "AppName": "ms-invoicing", "Business": "kappali", "Version": "v1" },
"ServiceBus": {
"Enable": true,
"FullyQualifiedNamespace": "sb-kappali-stg.servicebus.windows.net",
"UseQueue": false,
"EnableDiagnostic": true
}
}
| Opción | Valor por defecto | Para qué sirve |
|---|---|---|
Enable |
false |
Con false no se registra nada y no se abre conexión |
FullyQualifiedNamespace |
— | Namespace, cuando se autentica con Entra ID |
ConnectionString |
null |
Alternativa a lo anterior; tiene prioridad si se define |
ManagementConnectionString |
null |
Solo para el emulador, que separa el plano de gestión |
AutoProvisionEntities |
true |
Crear topics y suscripciones al vuelo |
MaxRetry |
10 |
Reintentos antes de mandar el mensaje a la DLQ |
RetryIntervalMs / MaxRetryIntervalMs |
2000 / 60000 |
Base y techo del backoff exponencial |
MaxConcurrentCalls |
4 |
Mensajes procesados a la vez por suscripción |
PrefetchCount |
0 |
Sin prelectura: la espera del backoff retiene el bloqueo |
LockDurationSeconds |
300 |
Bloqueo del mensaje, máximo que admite Service Bus |
MaxAutoLockRenewalMinutes |
10 |
Debe superar a MaxRetryIntervalMs; se valida |
MessageTimeToLiveHours |
48 |
Caducidad del mensaje en la suscripción |
RegisterHealthCheck |
true |
Registra los chequeos con etiqueta ready |
Autenticación
Por defecto se usa DefaultAzureCredential contra FullyQualifiedNamespace, lo que en AKS se traduce en Workload Identity. La identidad necesita el rol Azure Service Bus Data Owner, porque AutoProvisionEntities crea entidades; con las entidades ya creadas y AutoProvisionEntities en false bastan Data Sender y Data Receiver.
ConnectionString existe para el desarrollo local y el emulador, que no admiten Entra ID.
Reintentos y dead-letter
error de negocio (CodeDesignPlusException) -> DLQ inmediata, motivo "BusinessError"
error de infraestructura, quedan reintentos -> espera creciente y AbandonMessageAsync
error de infraestructura, agotados -> DLQ, motivo "MaxRetriesExceeded"
La espera crece de forma exponencial desde RetryIntervalMs hasta MaxRetryIntervalMs, con una dispersión de hasta el 20% para que varias réplicas que fallaron a la vez no reintenten a la vez. Transcurre en proceso, con el bloqueo del mensaje retenido y renovándose solo. La alternativa —completar el mensaje y reprogramar una copia— libera el bloqueo antes, pero completar y reprogramar no son operaciones atómicas y una caída entre ambas pierde el evento.
La suscripción se crea con MaxDeliveryCount = MaxRetry + 1: decide primero el consumidor, que es quien sabe distinguir un error de negocio, y el broker queda como red de seguridad para el caso de que el proceso muera antes de decidir.
Pruebas
Las pruebas de integración usan el emulador oficial (mcr.microsoft.com/azure-messaging/servicebus-emulator más su SQL Server), levantado por ServiceBusCollectionFixture de CodeDesignPlus.Net.xUnit.
El emulador impone topes que Azure no tiene y que obligan a bajar los valores de producción en las pruebas:
| Emulador | Azure | |
|---|---|---|
MaxDeliveryCount |
1 a 10 | hasta 2.147.483.647 |
DefaultMessageTimeToLive |
1 s a 1 h | hasta TimeSpan.MaxValue |
UserMetadata de un topic |
se descarta | se conserva |
| Plano de gestión | puerto aparte (5300) | mismo extremo |
Límites que conviene conocer
- 256 KB por mensaje en el nivel Standard, propiedades incluidas. La librería comprueba el tamaño antes de enviar y lanza un
ServiceBusPubSubExceptionque nombra el evento y su tamaño. - 1.000 operaciones por segundo por namespace en Standard.
- Un mensaje publicado en un topic con N suscripciones son N entregas facturables.
- 10.000 topics por namespace y 2.000 suscripciones por topic.
Contributing
Please read CONTRIBUTING for details on our code of conduct, and the process for submitting pull requests to us.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Contact
CodeDesignPlus - @CodeDesignPlus - custom.software@codedesignplus.com
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net9.0 is compatible. 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 was computed. 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. |
-
net9.0
- Azure.Identity (>= 1.14.0)
- CodeDesignPlus.Net.ServiceBus.Abstractions (>= 1.0.0-beta.13054)
- Microsoft.Extensions.Diagnostics.HealthChecks (>= 9.0.7)
- Microsoft.Extensions.Logging.Abstractions (>= 9.0.7)
- Microsoft.Extensions.Options (>= 9.0.7)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 9.0.7)
- Microsoft.Extensions.Options.DataAnnotations (>= 9.0.7)
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 |
|---|---|---|
| 1.0.0-beta.13054 | 0 | 9/19/2026 |