namespace Dpz.Core.MessageQueue.Models;

/// <summary>
/// Outbox 后台补发服务记录在缓存中的最近一次运行状态。
/// </summary>
public sealed record MessageOutboxRetryState
{
    /// <summary>
    /// 初始化 Outbox 后台补发运行状态。
    /// </summary>
    /// <param name="startedAtUtc">本轮补发开始时间(UTC)。</param>
    /// <param name="completedAtUtc">本轮补发完成时间(UTC)。</param>
    /// <param name="publishRetryCount">本轮尝试补发发布失败消息的数量。</param>
    /// <param name="publishFailureCount">本轮发布失败消息补发后仍失败的数量。</param>
    /// <param name="consumeRetryCount">本轮尝试重新入队消费失败消息的数量。</param>
    /// <param name="consumeFailureCount">本轮消费失败消息重新入队后仍失败的数量。</param>
    public MessageOutboxRetryState(
        DateTimeOffset startedAtUtc,
        DateTimeOffset completedAtUtc,
        int publishRetryCount,
        int publishFailureCount,
        int consumeRetryCount,
        int consumeFailureCount
    )
    {
        StartedAtUtc = startedAtUtc;
        CompletedAtUtc = completedAtUtc;
        PublishRetryCount = publishRetryCount;
        PublishFailureCount = publishFailureCount;
        ConsumeRetryCount = consumeRetryCount;
        ConsumeFailureCount = consumeFailureCount;
    }

    /// <summary>
    /// 本轮补发开始时间(UTC)。
    /// </summary>
    public DateTimeOffset StartedAtUtc { get; init; }

    /// <summary>
    /// 本轮补发完成时间(UTC)。
    /// </summary>
    public DateTimeOffset CompletedAtUtc { get; init; }

    /// <summary>
    /// 本轮尝试补发发布失败消息的数量。
    /// </summary>
    public int PublishRetryCount { get; init; }

    /// <summary>
    /// 本轮发布失败消息补发后仍失败的数量。
    /// </summary>
    public int PublishFailureCount { get; init; }

    /// <summary>
    /// 本轮尝试重新入队消费失败消息的数量。
    /// </summary>
    public int ConsumeRetryCount { get; init; }

    /// <summary>
    /// 本轮消费失败消息重新入队后仍失败的数量。
    /// </summary>
    public int ConsumeFailureCount { get; init; }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这段代码定义了一个用于记录消息队列 Outbox 模式后台补发服务运行状态的不可变数据模型。让我详细解释一下:

代码结构分析

1. 类型定义

public sealed record MessageOutboxRetryState
  • 使用 record 关键字定义不可变记录类型
  • sealed 防止被继承
  • 用于存储 Outbox 后台补发服务的运行状态快照

2. 构造函数

构造函数接收6个参数,用于初始化一次完整的补发运行状态:

  • 时间相关:开始时间和完成时间(UTC)
  • 发布重试相关:重试数量和失败数量
  • 消费重试相关:重试数量和失败数量

3. 属性说明

时间属性

  • StartedAtUtc:补发任务开始时间
  • CompletedAtUtc:补发任务完成时间

发布相关统计

  • PublishRetryCount:尝试重新发布失败消息的总数
  • PublishFailureCount:重新发布后仍然失败的消息数

消费相关统计

  • ConsumeRetryCount:尝试重新入队消费失败消息的总数
  • ConsumeFailureCount:重新入队后仍然失败的消息数

使用场景

这个模型主要用于:

  1. 监控和观测:跟踪 Outbox 后台服务的运行效果
  2. 故障诊断:通过失败统计定位问题
  3. 性能分析:评估补发策略的有效性
  4. 运维告警:基于失败率触发告警机制

设计特点

  • 不可变性:使用 recordinit 确保数据一致性
  • 完整性:涵盖了发布和消费两个维度的重试统计
  • 时间精确性:使用 UTC 时间避免时区问题
  • 类型安全:强类型设计,避免运行时错误

这是一个设计良好的数据传输对象,适合在分布式系统中进行状态监控和问题诊断。

评论加载中...