/
afanasevn
/
RedisLab
Обзор
Документация
Войти
/
afanasevn
/
RedisLab
Код
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/RedisLab.Infrastructure/Notifications/NotificationStreamPublisher.cs
43 строки
2 KB
IBS\NAfanasev
Solution commit
24 июн 2026, 16:45
24 июн 2026, 16:45
bab80b7
Код
Авторство
О чём код?
using System.Text.Json; using Microsoft.Extensions.Logging; using RedisLab.Application.Abstractions; using RedisLab.Application.Contracts.Activity; using RedisLab.Application.Redis; using StackExchange.Redis; namespace RedisLab.Infrastructure.Notifications; /// <summary> /// Outbox-lite: XADD notifications:stream — сообщения сохраняются в Redis до XACK consumer-ом. /// В отличие от Pub/Sub (activity:feed), offline consumer прочитает backlog после restart. /// Это учебный паттерн, не замена RabbitMQ / Kafka в production. /// </summary> public sealed class NotificationStreamPublisher( IConnectionMultiplexer redis, ILogger<NotificationStreamPublisher> logger) : INotificationStreamPublisher { private static readonly JsonSerializerOptions JsonOptions = new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, }; /// <inheritdoc /> public async Task EnqueueAsync( ActivityFeedMessage message, CancellationToken ct) { var database = redis.GetDatabase(); var payload = JsonSerializer.Serialize(message, JsonOptions); // XADD * payload {json} — append-only log; consumer group читает с XREADGROUP и подтверждает XACK. var streamId = await database.StreamAddAsync( RedisKeyNames.NotificationsStream, [new NameValueEntry("payload", payload)]); logger.LogInformation( "Notification XADD {Stream} id={StreamId} type={Type}", RedisKeyNames.NotificationsStream, streamId, message.Type); } }