CodeDesignPlus.Net.PubSub 1.0.0-beta.13752

This is a prerelease version of CodeDesignPlus.Net.PubSub.
There is a newer prerelease version of this package available.
See the version list below for details.
dotnet add package CodeDesignPlus.Net.PubSub --version 1.0.0-beta.13752
                    
NuGet\Install-Package CodeDesignPlus.Net.PubSub -Version 1.0.0-beta.13752
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="CodeDesignPlus.Net.PubSub" Version="1.0.0-beta.13752" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="CodeDesignPlus.Net.PubSub" Version="1.0.0-beta.13752" />
                    
Directory.Packages.props
<PackageReference Include="CodeDesignPlus.Net.PubSub" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add CodeDesignPlus.Net.PubSub --version 1.0.0-beta.13752
                    
#r "nuget: CodeDesignPlus.Net.PubSub, 1.0.0-beta.13752"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package CodeDesignPlus.Net.PubSub@1.0.0-beta.13752
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=CodeDesignPlus.Net.PubSub&version=1.0.0-beta.13752&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=CodeDesignPlus.Net.PubSub&version=1.0.0-beta.13752&prerelease
                    
Install as a Cake Tool

CodeDesignPlus.Net.PubSub

Quality Gate Status Bugs Code Smells Coverage Duplicated Lines (%) Vulnerabilities

Description

CodeDesignPlus.Net.PubSub provides a robust framework for implementing publish-subscribe patterns in .NET Core applications. This library simplifies the process of publishing and subscribing to messages, enabling developers to build scalable and decoupled event-driven systems.

Table of Contents

About The Project

CodeDesignPlus.Net.PubSub provides a robust framework for implementing publish-subscribe patterns in .NET Core applications. This library simplifies the process of publishing and subscribing to messages, enabling developers to build scalable and decoupled event-driven systems.

Key Features

  1. Ease of Use: Simplifies the implementation of publish-subscribe patterns.
  2. Scalability: Designed to support scalable and decoupled event-driven architectures.
  3. Integration: Seamlessly integrates with other CodeDesignPlus.Net libraries.
  4. Comprehensive Documentation: Includes extensive documentation and support for common tasks.

Installation

To install the package, run the following command:

dotnet add package CodeDesignPlus.Net.PubSub

Usage

For more information regarding the library, you can visit our documentation at CodeDesignPlus Doc

Sincronización inicial de proyecciones (fotos)

Una copia local que se alimenta de eventos solo recibe lo que pasa desde que existe su cola. Para que nazca completa, la copia pide una foto al arrancar y el dueño contesta con un evento de foto por agregado, dirigido a quien la pidió y paginado. La copia aplica con upsert y marca la fuente como sincronizada cuando aplicó todas las fotos que anunció el dueño.

Lado del dueño

  1. Declare el evento de foto del agregado, con su estado completo, heredando de SnapshotDomainEvent:

    [EventKey<AssemblyAggregate>(1, "AssemblySnapshotDomainEvent")]
    public class AssemblySnapshotDomainEvent(Guid aggregateId, string title, Instant scheduledDate, Instant? completedAt, bool isCancelled, Guid tenant, Guid? eventId = null, Instant? occurredAt = null, Dictionary<string, object>? metadata = null)
        : SnapshotDomainEvent(aggregateId, tenant, eventId, occurredAt, metadata) { ... }
    
  2. Implemente ISnapshotSource<TSnapshot>: devuelve una página de fotos con orden estable (por Id), de una copropiedad o de todas. Póngala en el ensamblado del worker. El SDK la descubre y se suscribe solo a SnapshotRequestedDomainEvent; contesta las peticiones que nombran su Core:AppName, el agregado y el nombre de esa foto. Un agregado puede tener varias fotos (una por vista que copian otros), cada una con su fuente.

    public class AssemblySnapshotSource(IAssemblyRepository repository) : ISnapshotSource<AssemblySnapshotDomainEvent>
    {
        public async Task<IReadOnlyList<AssemblySnapshotDomainEvent>> GetPageAsync(Guid? tenant, int page, int pageSize, CancellationToken cancellationToken)
        {
            var assemblies = await repository.GetPageAsync(tenant, page, pageSize, cancellationToken);
    
            return [.. assemblies.Select(x => new AssemblySnapshotDomainEvent(x.Id, ...))];
        }
    }
    

El tamaño de página es PubSub:SnapshotPageSize (100 por defecto).

Lado de la copia

  1. Declare el gemelo del evento de foto: la clave nombra al dueño (aplicación) y al agregado (entidad). De ahí sale a quién se le pide.

    [EventKey("AssemblyAggregate", 1, "AssemblySnapshotDomainEvent", "ms-assemblies", "kappali")]
    public class AssemblySnapshotDomainEvent(...) : SnapshotDomainEvent(...)
    
  2. Consuma la foto heredando de SnapshotHandler<TSnapshot> e implemente ApplyAsync como un upsert idempotente. Para no pisar un evento en vivo más nuevo, la copia guarda el OccurredAt del último evento del dueño que aplicó (un campo nuevo fuera del constructor) y solo reemplaza si snapshot.Supersedes(copia.SourceChangedAt).

    [QueueName<AssemblyProjectionAggregate>("AssemblySnapshotHandler")]
    public class AssemblySnapshotHandler(IAssemblyProjectionRepository repository, IOptions<CoreOptions> coreOptions)
        : SnapshotHandler<AssemblySnapshotDomainEvent>(coreOptions)
    {
        protected override async Task ApplyAsync(AssemblySnapshotDomainEvent snapshot, CancellationToken cancellationToken) { ... }
    }
    
  3. Nada más. Con un SnapshotHandler en el ensamblado, el SDK:

    • espera a que estén suscritos todos los consumidores (una foto publicada antes de que exista la cola se pierde);
    • mira en IProjectionSyncStore si esa foto ya está sincronizada (un documento por dueño y evento de foto) (CodeDesignPlus.Net.Mongo lo registra: colección ProjectionSyncState); si no, publica SnapshotRequestedDomainEvent y lo anota;
    • cuenta cada foto que ApplyAsync aplica sin lanzar (una vez por mensaje, aunque el bus la reentregue) y, al llegar SnapshotCompletedDomainEvent de esa petición, anota cuántas anunció el dueño. La fuente queda sincronizada solo cuando las dos cifras coinciden, lo vea primero el cierre o la última foto: llegan por colas distintas y en cualquier orden;
    • si el dueño cerró y faltan fotos (alguna acabó en la cola de descartados), la deja incompleta. Al siguiente arranque, o pasado PubSub:SnapshotRetryInterval (una hora por defecto; 00:00:00 lo desactiva) desde la última petición, la vuelve a pedir y deja una advertencia en el log con cuántas aplicó de cuántas. Lo mismo si el dueño no contestó.

Para reparar una copropiedad a mano, inyecte ISnapshotRequester y llame a RequestAsync<AssemblySnapshotDomainEvent>(tenant, token) desde un endpoint de soporte. Para volver a pedir la foto completa, borre el documento de esa foto en ProjectionSyncState y reinicie el micro.

La cuenta vive en dos colecciones más de la base de la copia: ProjectionSnapshotProgress (una por petición: aplicadas y anunciadas) y ProjectionSnapshotReceipt (una por foto aplicada, para no contar dos veces una reentrega). Se borran al quedar sincronizada la foto. Una marca de ProjectionSyncState sin Applied se puso antes de que se contaran las fotos: no prueba que la copia esté completa y la foto se vuelve a pedir una vez.

Lo que hay que saber

  • Las peticiones y los cierres son contratos de plataforma con clave fija (codedesignplus.ms-snapshots.v1.projectionsnapshot.*): todas las aplicaciones publican y escuchan en el mismo tema y descartan lo que no las nombra.
  • Las fotos van al tema del evento de foto de cada pareja; si dos copias del mismo agregado sincronizan, cada una descarta la que pidió la otra (RequestedBy).
  • Pedir dos veces (dos réplicas, un reinicio antes del cierre) no duplica: la copia aplica con upsert.
  • Se cuenta una foto por mensaje y se asume un solo SnapshotHandler por evento de foto en cada aplicación.
  • Todo es aditivo: un consumidor desplegado que no conoce los eventos nuevos no cambia.

Roadmap

Refer to issues for a list of proposed features and known issues.

Roadmap

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b features/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

License

Distributed under the MIT License. See LICENSE for more information.

Contact

CodeDesignPlus - @CodeDesignPlus - wliscano@codedesignplus.com

Project Link: CodeDesignPlus.Net.PubSub

Product 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (5)

Showing the top 5 NuGet packages that depend on CodeDesignPlus.Net.PubSub:

Package Downloads
CodeDesignPlus.Net.RabbitMQ.Abstractions

CodeDesignPlus.Net.RabbitMQ.Abstractions provides essential interfaces and abstract classes for integrating RabbitMQ with .NET Core applications. This library defines core contracts and abstractions that facilitate a clean and maintainable architecture for event-driven systems using RabbitMQ, enabling better testing and extensibility.

CodeDesignPlus.Net.EventStore.PubSub.Abstractions

CodeDesignPlus.Net.EventStore.PubSub.Abstractions provides essential interfaces and abstract classes for implementing publish-subscribe patterns in event sourcing within .NET Core applications. This library defines core contracts and abstractions that facilitate a clean and maintainable architecture for event-driven systems, enabling better testing and extensibility.

CodeDesignPlus.Net.Redis.PubSub.Abstractions

CodeDesignPlus.Net.Redis.PubSub.Abstractions provides essential interfaces and abstract classes for implementing publish-subscribe patterns with Redis in .NET Core applications. This library defines core contracts and abstractions that facilitate a clean and maintainable architecture for event-driven systems using Redis, enabling better testing and extensibility.

CodeDesignPlus.Net.Kafka.Abstractions

CodeDesignPlus.Net.Kafka.Abstractions provides essential interfaces and abstract classes for integrating Apache Kafka with .NET Core applications. This library defines core contracts and abstractions that facilitate a clean and maintainable architecture for event-driven systems using Kafka, enabling better testing and extensibility.

CodeDesignPlus.Net.ServiceBus.Abstractions

CodeDesignPlus.Net.ServiceBus.Abstractions provides essential interfaces and abstract classes for integrating Azure Service Bus with .NET Core applications. This library defines core contracts and abstractions that facilitate a clean and maintainable architecture for event-driven systems using Azure Service Bus topics and subscriptions, enabling better testing and extensibility.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.0-beta.13767 0 10/21/2026
1.0.0-beta.13752 0 10/21/2026
1.0.0-beta.13740 35 10/20/2026
1.0.0-beta.13714 320 10/19/2026
1.0.0-beta.13683 205 10/15/2026
1.0.0-beta.13676 181 10/15/2026
1.0.0-beta.13664 87 10/15/2026
1.0.0-beta.13642 120 10/14/2026
1.0.0-beta.13633 116 10/13/2026
1.0.0-beta.13622 133 10/6/2026
1.0.0-beta.13614 102 10/6/2026
1.0.0-beta.13605 112 10/5/2026
1.0.0-beta.13603 95 10/5/2026
1.0.0-beta.13598 99 10/5/2026
1.0.0-beta.13592 136 10/4/2026
1.0.0-beta.13584 161 10/3/2026
1.0.0-beta.13582 204 10/2/2026
1.0.0-beta.13576 110 10/2/2026
1.0.0-beta.13574 97 10/2/2026
0.11.0 970 7/23/2025
Loading failed