RabbitMQ 默认从单一回调通道提升为三类任务独立并行,跨类型并发能力由 1 提升到 3;每类还能独立配置 1–16 个消费者。[RabbitMqBackgroundJobs.cs (line 143)](E:/jiaowu/src/Jiaowu.Api/Infrastructure/BackgroundJobs/RabbitMqBackgroundJobs.cs:143) InMemory 开发模式同步改为按任务类型隔离队列,避免某类长任务堵塞其他任务。 租约恢复检查从“每发布一条执行一次”改为默认每 60 秒维护一次。 启动恢复改为数据库 NOT EXISTS 查询,不再把全部历史 Outbox 加载进内存。[BackgroundJobOutboxPublisher.cs (line 9)](E:/jiaowu/src/Jiaowu.Api/Infrastructure/BackgroundJobs/BackgroundJobOutboxPublisher.cs:9) 完成消息默认保留 14 天,之后按每批 500 条清理,并增加对应组合索引。 /health/messaging 现在返回各状态积压量、过期租约和最老任务等待时间。[BackgroundJobMonitoringService.cs (line 16)](E:/jiaowu/src/Jiaowu.Api/Infrastructure/BackgroundJobs/BackgroundJobMonitoringService.cs:16) 新增 Jiaowu.BackgroundJobs 运行时指标,覆盖发布量、处理量、发布耗时、处理耗时和清理量。[BackgroundJobTelemetry.cs (line 9)](E:/jiaowu/src/Jiaowu.Api/Infrastructure/BackgroundJobs/BackgroundJobTelemetry.cs:9) 配置、Compose 和调优建议已更新。[README.md (line 257)](E:/jiaowu/README.md:257)
75 lines
2.2 KiB
C#
75 lines
2.2 KiB
C#
using System.Diagnostics;
|
|
using System.Diagnostics.Metrics;
|
|
using Jiaowu.Api.Domain.System;
|
|
|
|
namespace Jiaowu.Api.Infrastructure.BackgroundJobs;
|
|
|
|
public sealed class BackgroundJobTelemetry : IDisposable
|
|
{
|
|
public const string MeterName = "Jiaowu.BackgroundJobs";
|
|
|
|
private readonly Meter _meter = new(MeterName, "1.0.0");
|
|
private readonly Counter<long> _published;
|
|
private readonly Counter<long> _processed;
|
|
private readonly Histogram<double> _publishDuration;
|
|
private readonly Histogram<double> _processingDuration;
|
|
private readonly Counter<long> _cleaned;
|
|
|
|
public BackgroundJobTelemetry()
|
|
{
|
|
_published = _meter.CreateCounter<long>(
|
|
"jiaowu.background_jobs.published",
|
|
unit: "{message}");
|
|
_processed = _meter.CreateCounter<long>(
|
|
"jiaowu.background_jobs.processed",
|
|
unit: "{job}");
|
|
_publishDuration = _meter.CreateHistogram<double>(
|
|
"jiaowu.background_jobs.publish.duration",
|
|
unit: "ms");
|
|
_processingDuration = _meter.CreateHistogram<double>(
|
|
"jiaowu.background_jobs.processing.duration",
|
|
unit: "ms");
|
|
_cleaned = _meter.CreateCounter<long>(
|
|
"jiaowu.background_jobs.outbox.cleaned",
|
|
unit: "{message}");
|
|
}
|
|
|
|
public void RecordPublish(
|
|
BackgroundJobKind kind,
|
|
bool durable,
|
|
string outcome,
|
|
TimeSpan duration)
|
|
{
|
|
var tags = new TagList
|
|
{
|
|
{ "job.kind", kind.ToString() },
|
|
{ "messaging.backend", durable ? "rabbitmq" : "memory" },
|
|
{ "job.outcome", outcome }
|
|
};
|
|
_published.Add(1, tags);
|
|
_publishDuration.Record(duration.TotalMilliseconds, tags);
|
|
}
|
|
|
|
public void RecordProcessing(
|
|
BackgroundJobKind kind,
|
|
string outcome,
|
|
TimeSpan duration)
|
|
{
|
|
var tags = new TagList
|
|
{
|
|
{ "job.kind", kind.ToString() },
|
|
{ "job.outcome", outcome }
|
|
};
|
|
_processed.Add(1, tags);
|
|
_processingDuration.Record(duration.TotalMilliseconds, tags);
|
|
}
|
|
|
|
public void RecordCleaned(int count)
|
|
{
|
|
if (count > 0)
|
|
_cleaned.Add(count);
|
|
}
|
|
|
|
public void Dispose() => _meter.Dispose();
|
|
}
|