赏听然 发表于 2025-6-1 21:32:10

怎样配置blazor才能提高吞吐量

怎样配置blazor才能提高吞吐量

为了提高 Blazor 应用的吞吐量,可以从以下几个方面进行配置和优化:
1. 启用响应压缩:通过压缩传输的数据量来减少带宽消耗。
2. 配置 SignalR:调整 SignalR 的配置以提高数据传输效率。
3. 优化 Circuit 选项:调整 Blazor Server 的 Circuit 配置以提高性能。
4. 使用静态文件缓存:配置静态文件缓存以减少服务器负载。
5. 使用 HTTP/2:启用 HTTP/2 以提高传输效率。以下是具体的配置示例:

```
var builder = WebApplication.CreateBuilder(args);

// 启用响应压缩
builder.Services.AddResponseCompression(options =>
{
    options.Providers.Add<BrotliCompressionProvider>();
    options.Providers.Add<GzipCompressionProvider>();
    options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(new[] { "image/svg+xml" });
});
builder.Services.Configure<BrotliCompressionProviderOptions>(options =>
{
    options.Level = CompressionLevel.Optimal;
});

// 配置 SignalR
builder.Services.AddRazorComponents().AddInteractiveServerComponents()
    .AddCircuitOptions(a =>
    {
      a.JSInteropDefaultCallTimeout = TimeSpan.FromMinutes(2);
      a.MaxBufferedUnacknowledgedRenderBatches = 20;
      a.DisconnectedCircuitRetentionPeriod = TimeSpan.FromMinutes(10);
      a.DisconnectedCircuitMaxRetained = 200;
    })
    .AddHubOptions(options =>
    {
      options.MaximumReceiveMessageSize = 10 * 1024 * 1024;
      options.ClientTimeoutInterval = TimeSpan.FromSeconds(60);
      options.HandshakeTimeout = TimeSpan.FromSeconds(30);
      options.StreamBufferCapacity = 20;
    });

// 启用 HTTP/2
builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.ListenAnyIP(5000, listenOptions =>
    {
      listenOptions.Protocols = HttpProtocols.Http2;
    });
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseResponseCompression();
}

app.UseStaticFiles(new StaticFileOptions
{
    OnPrepareResponse = ctx =>
    {
      ctx.Context.Response.Headers.Append("Cache-Control", "public,max-age=600");
    }
});

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapRazorPages();
app.MapDefaultControllerRoute();
app.MapRazorComponents().AddInteractiveServerRenderMode().AddAdditionalAssemblies();

app.Run();

```具体优化点说明:

SignalR 配置:调整 MaximumReceiveMessageSize、ClientTimeoutInterval、HandshakeTimeout 和 StreamBufferCapacity 等参数,提高数据传输效率。


[*]MaximumReceiveMessageSize 参数用于配置 SignalR 服务中,服务器端可以接收的单个消息的最大大小。这个参数的作用是控制服务器端能够处理的最大消息大小,以防止过大的消息导致服务器资源耗尽或性能问题。
参数说明
•        默认值:默认情况下,这个值是 32 KB (32 * 1024 字节)。
•        作用:当客户端发送的消息大小超过 MaximumReceiveMessageSize 的值时,服务器端将拒绝处理该消息,并抛出异常。
调整建议
•        增大值:如果你的应用需要处理较大的消息(例如文件上传或大数据传输),可以考虑增大这个值。
•        减小值:如果你希望限制消息大小,以防止过大的消息影响服务器性能,可以考虑减小这个值。
[*]ClientTimeoutInterval 参数用于配置 SignalR 服务中,服务器等待客户端响应的最大时间间隔。这个参数的作用是控制服务器在等待客户端发送消息或心跳信号时的超时时间。如果在指定的时间内没有收到客户端的消息或心跳信号,服务器将认为客户端已断开连接。
参数说明
•        默认值:默认情况下,这个值是 30 秒。
•        作用:当服务器在指定的时间内没有收到客户端的消息或心跳信号时,服务器将断开与客户端的连接。
调整建议
•        增大值:如果你的应用需要处理较长时间的操作,或者网络延迟较大,可以考虑增大这个值,以避免误判客户端断开连接。
•        减小值:如果你希望更快地检测到客户端断开连接的问题,可以考虑减小这个值。
[*]HandshakeTimeout 参数用于配置 SignalR 服务中,服务器等待客户端完成握手的最大时间间隔。握手是客户端和服务器之间建立连接的初始步骤,HandshakeTimeout 控制服务器在等待客户端完成握手时的超时时间。如果在指定的时间内握手未完成,服务器将断开连接。
参数说明
•        默认值:默认情况下,这个值是 15 秒。
•        作用:当服务器在指定的时间内没有收到客户端的握手完成消息时,服务器将断开与客户端的连接。
调整建议
•        增大值:如果你的应用需要处理较长时间的握手操作,或者网络延迟较大,可以考虑增大这个值,以避免误判客户端握手失败。
•        减小值:如果你希望更快地检测到握手失败的问题,可以考虑减小这个值。
[*]StreamBufferCapacity 参数用于配置 SignalR 服务中,服务器为客户端上传流缓冲的最大项数。这个参数的作用是控制服务器在处理客户端上传流时,可以缓冲的最大项数。如果达到此限制,服务器将阻止处理调用,直到服务器处理完一些缓冲项。
参数说明
•        默认值:默认情况下,这个值是 10。
•        作用:当客户端上传流数据时,服务器会将数据项缓存在内存中。如果缓冲的项数超过 StreamBufferCapacity 的值,服务器将暂停处理新的数据项,直到处理完一些缓冲项。
调整建议
•        增大值:如果你的应用需要处理大量的流数据,可以考虑增大这个值,以减少服务器因缓冲区满而暂停处理的情况。
•        减小值:如果你希望限制服务器的内存使用,或者希望更快地检测到缓冲区满的问题,可以考虑减小这个值。
Circuit 选项:调整 JSInteropDefaultCallTimeout、MaxBufferedUnacknowledgedRenderBatches、DisconnectedCircuitRetentionPeriod 和 DisconnectedCircuitMaxRetained 等参数,优化 Blazor Server 的性能。


[*]JSInteropDefaultCallTimeout 参数用于配置 Blazor Server 应用中,异步调用 JavaScript 函数的最大等待时间。这个参数的作用是控制从 Blazor 服务器端调用 JavaScript 函数时,等待 JavaScript 函数执行完成的最大时间。
参数说明
•        默认值:默认情况下,这个值是 1 分钟。
•        作用:当 Blazor 服务器端调用 JavaScript 函数时,如果在指定的时间内没有收到 JavaScript 函数的响应,调用将超时并抛出异常。
调整建议
•        增大值:如果你的 JavaScript 函数执行时间较长,可以考虑增大这个值,以避免调用超时。
•        减小值:如果你希望更快地检测到 JavaScript 函数执行超时的问题,可以考虑减小这个值。
[*]MaxBufferedUnacknowledgedRenderBatches 参数用于配置 Blazor Server 应用中,服务端在内存中可以暂存的最大未确认渲染批次的数量。这个参数的作用是控制服务端在等待客户端确认渲染批次时,可以暂存的最大渲染批次数量。
参数说明
•        默认值:默认情况下,这个值是 10。
•        作用:当客户端处理速度较慢时,服务端会暂存渲染批次。如果暂存的渲染批次数量超过 MaxBufferedUnacknowledgedRenderBatches 的值,服务端将停止渲染新的批次,直到客户端处理完一些批次并发送确认。
调整建议
•        增大值:如果你的应用有大量的渲染操作,并且客户端处理速度较慢,可以考虑增大这个值,以减少服务端因等待客户端确认而停止渲染的情况。
•        减小值:如果你的应用内存有限,或者你希望更快地检测到客户端处理速度慢的问题,可以考虑减小这个值。
这些配置和优化可以帮助提高 Blazor 应用的吞吐量和整体性能。
[*]DisconnectedCircuitRetentionPeriod 参数用于配置 Blazor Server 应用中,每个 Circuit 断联之后在内存中保持状态的最大时间。这个参数的作用是控制当客户端断开连接时,服务器端保留该客户端状态的时间长度,以便客户端重新连接时可以恢复状态。
参数说明
•        默认值:默认情况下,这个值是 3 分钟。
•        作用:当客户端断开连接时,服务器端会保留该客户端的状态。如果客户端在指定的时间内重新连接,服务器端将恢复该客户端的状态。如果超过这个时间,服务器端将释放该客户端的状态,客户端重新连接时将无法恢复之前的状态。
调整建议
•        增大值:如果你的应用需要在客户端断开连接后较长时间内保持状态,可以考虑增大这个值。
•        减小值:如果你希望更快地释放断开连接的客户端状态,以节省服务器资源,可以考虑减小这个值。
[*]DisconnectedCircuitMaxRetained 参数用于配置 Blazor Server 应用中,服务器端在内存中可以保留的断开连接的 Circuit 的最大数量。这个参数的作用是控制服务器端在内存中保留的断开连接的客户端状态的数量上限。
参数说明
•        默认值:默认情况下,这个值是 100。
•        作用:当客户端断开连接时,服务器端会保留该客户端的状态。如果断开连接的客户端数量超过 DisconnectedCircuitMaxRetained 的值,服务器端将开始丢弃最早断开连接的客户端状态,以确保总数量不超过这个上限。
调整建议
•        增大值:如果你的应用需要在客户端断开连接后保留更多的客户端状态,可以考虑增大这个值。
•        减小值:如果你希望更快地释放断开连接的客户端状态,以节省服务器资源,可以考虑减小这个值。
如何监控 Blazor 应用的性能以进一步优化吞吐量?

监控 Blazor 应用的性能是优化吞吐量的重要步骤。以下是一些方法和工具,可以帮助你监控和分析 Blazor 应用的性能:

[*]使用 Application Insights
Application Insights 是一个强大的监控工具,可以帮助你收集和分析应用的性能数据。
安装和配置 Application Insights
在 Program.cs 文件中添加以下代码:
using Microsoft.ApplicationInsights.AspNetCore.Extensions;

var builder = WebApplication.CreateBuilder(args);

// 添加 Application Insights 服务
builder.Services.AddApplicationInsightsTelemetry(builder.Configuration["ApplicationInsights:InstrumentationKey"]);

var app = builder.Build();

// 启用 Application Insights 请求跟踪
app.UseApplicationInsightsRequestTelemetry();
app.UseApplicationInsightsExceptionTelemetry();

app.Run();确保在 appsettings.json 文件中添加 Application Insights 的 Instrumentation Key:
{
"ApplicationInsights": {
    "InstrumentationKey": "your-instrumentation-key"
}
}
[*]使用浏览器开发者工具


[*]浏览器开发者工具(如 Chrome DevTools)可以帮助你分析前端性能。你可以使用以下功能:
•        Network:查看网络请求的时间和大小。
•        Performance:记录和分析页面的性能。
•        Memory:监控内存使用情况,查找内存泄漏。

[*]使用 .NET Core 性能工具


[*].NET Core 提供了一些性能工具,可以帮助你分析和诊断应用的性能问题:
•        dotnet-counters:实时监控 .NET Core 应用的性能计数器。
•        dotnet-trace:收集 .NET Core 应用的跟踪日志。
•        dotnet-dump:收集和分析 .NET Core 应用的内存转储。

[*]优化建议


[*]根据监控结果,你可以进行以下优化:
•        减少组件重渲染:避免不必要的组件重渲染,使用 ShouldRender 方法控制渲染。
•        优化数据加载:使用分页、缓存等技术优化数据加载。
•        减少 JavaScript 互操作调用:尽量减少与 JavaScript 的互操作调用,使用批量调用或减少调用频率。
•        使用异步方法:尽量使用异步方法,提高应用的响应速度。
通过以上方法和工具,你可以有效监控 Blazor 应用的性能,并根据监控结果进行优化,从而提高应用的吞吐量。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 怎样配置blazor才能提高吞吐量