perf: optimize authorization scoreline and workers

This commit is contained in:
2026-07-30 09:12:27 +08:00
parent 4bea745b79
commit bedc77bffd
52 changed files with 21911 additions and 347 deletions

View File

@@ -3,6 +3,12 @@ using Tiku.Application;
using Tiku.Infrastructure;
using Tiku.Infrastructure.Messaging;
using Tiku.Infrastructure.Security;
using Tiku.Api.Caching;
using Microsoft.AspNetCore.ResponseCompression;
using System.IO.Compression;
using Tiku.Api.Observability;
using Tiku.Application.Tenancy;
using Microsoft.Extensions.DependencyInjection.Extensions;
namespace Tiku.Api.Configuration;
@@ -18,6 +24,9 @@ public static class DependencyInjection
builder.Services.AddApiPresentation();
builder.Services.AddHealthChecks();
builder.Services.AddApiObservability(builder.Configuration, builder.Environment);
builder.Services.AddSingleton<OutboxBacklogSnapshot>();
builder.Services.AddHostedService<OutboxBacklogMonitor>();
builder.Services.AddApplication();
builder.Services.AddNetworkConfiguration(builder.Configuration, builder.Environment);
builder.Services.AddApiRateLimiting(builder.Configuration);
@@ -42,6 +51,31 @@ public static class DependencyInjection
throw new InvalidOperationException(
"Redis is required in Production. Configure ConnectionStrings:Redis or REDIS_URL.");
}
builder.Services.AddOutputCache(options =>
{
options.AddPolicy("TenantPublic", new TenantPublicOutputCachePolicy());
options.DefaultExpirationTimeSpan = TimeSpan.FromSeconds(60);
});
builder.Services.RemoveAll<ITenantPublicCacheInvalidator>();
builder.Services.AddSingleton<ITenantPublicCacheInvalidator, TenantPublicCacheInvalidator>();
if (builder.Environment.IsProduction() && !string.IsNullOrWhiteSpace(redisConnectionString))
{
builder.Services.AddStackExchangeRedisOutputCache(options =>
{
options.Configuration = redisConnectionString;
options.InstanceName = $"tiku:{builder.Environment.EnvironmentName.ToLowerInvariant()}:output:";
});
}
builder.Services.AddResponseCompression(options =>
{
options.EnableForHttps = true;
options.Providers.Add<BrotliCompressionProvider>();
options.Providers.Add<GzipCompressionProvider>();
options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(["application/json"]);
});
builder.Services.Configure<BrotliCompressionProviderOptions>(options => options.Level = CompressionLevel.Fastest);
builder.Services.Configure<GzipCompressionProviderOptions>(options => options.Level = CompressionLevel.Fastest);
var messaging = builder.Configuration.GetSection("RabbitMq").Get<MessagingOptions>() ?? new MessagingOptions();
builder.Services.AddOptions<MessagingOptions>()
.Bind(builder.Configuration.GetSection("RabbitMq"))