122 lines
4.1 KiB
C#
Raw Normal View History

2025-04-18 09:29:38 +08:00
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Jobs;
using Confluent.Kafka;
2025-04-30 09:50:50 +08:00
using JiShe.CollectBus.Common;
2025-04-18 09:29:38 +08:00
using JiShe.CollectBus.Kafka.AdminClient;
using JiShe.CollectBus.Kafka.Consumer;
2025-04-30 09:50:50 +08:00
using JiShe.CollectBus.Kafka.Internal;
2025-04-18 09:29:38 +08:00
using JiShe.CollectBus.Kafka.Producer;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JiShe.CollectBus.Kafka.Test
{
2025-05-28 16:45:30 +08:00
[SimpleJob(RuntimeMoniker.Net90)]
2025-04-18 09:29:38 +08:00
//[SimpleJob(RuntimeMoniker.NativeAot80)]
[RPlotExporter]
public class KafkaProduceBenchmark
{
// 每批消息数量
2025-04-30 09:50:50 +08:00
[Params(1000, 10000, 100000, 1000000)]
2025-04-18 09:29:38 +08:00
public int N;
public ServiceProvider _serviceProvider;
2025-04-30 09:50:50 +08:00
public IConsumerService _consumerService;
public IProducerService _producerService;
2025-04-18 09:29:38 +08:00
public string topic = "test-topic1";
[GlobalSetup]
public void Setup()
{
// 构建配置
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
// 直接读取配置项
2025-04-30 09:50:50 +08:00
var greeting = config["Kafka:ServerTagName"];
2025-04-18 09:29:38 +08:00
Console.WriteLine(greeting); // 输出: Hello, World!
// 创建服务容器
var services = new ServiceCollection();
// 注册 IConfiguration 实例
services.AddSingleton<IConfiguration>(config);
2025-04-30 09:50:50 +08:00
services.Configure<KafkaOptionConfig>(options =>
{
config.GetSection("Kafka").Bind(options);
});
services.Configure<ServerApplicationOptions>(options =>
{
config.GetSection(nameof(ServerApplicationOptions)).Bind(options);
});
2025-04-18 09:29:38 +08:00
// 初始化日志
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(config) // 从 appsettings.json 读取配置
.CreateLogger();
// 配置日志系统
services.AddLogging(logging =>
{
logging.ClearProviders();
logging.AddSerilog();
});
services.AddSingleton<IAdminClientService, AdminClientService>();
services.AddSingleton<IProducerService, ProducerService>();
services.AddSingleton<IConsumerService, ConsumerService>();
2025-04-30 09:50:50 +08:00
services.AddSingleton<KafkaPollyPipeline>();
services.AddTransient<KafkaSubscribeTest>();
2025-04-18 09:29:38 +08:00
// 构建ServiceProvider
_serviceProvider = services.BuildServiceProvider();
// 获取日志记录器工厂
var loggerFactory = _serviceProvider.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger<Program>();
logger.LogInformation("程序启动");
var adminClientService = _serviceProvider.GetRequiredService<IAdminClientService>();
2025-04-30 09:50:50 +08:00
2025-04-18 09:29:38 +08:00
//await adminClientService.DeleteTopicAsync(topic);
// 创建 topic
2025-04-30 09:50:50 +08:00
//adminClientService.CreateTopicAsync(topic, 3, 3).ConfigureAwait(false).GetAwaiter();
2025-04-18 09:29:38 +08:00
_consumerService = _serviceProvider.GetRequiredService<IConsumerService>();
_producerService = _serviceProvider.GetRequiredService<IProducerService>();
}
[Benchmark]
public async Task UseAsync()
{
List<Task> tasks = new();
for (int i = 0; i < N; ++i)
{
var task = _producerService.ProduceAsync<string>(topic, i.ToString());
tasks.Add(task);
}
await Task.WhenAll(tasks);
}
[Benchmark]
public async Task UseLibrd()
{
List<Task> tasks = new();
for (int i = 0; i < N; ++i)
{
2025-04-30 09:50:50 +08:00
var task = _producerService.ProduceAsync<string>(topic, i.ToString(), null);
2025-04-18 09:29:38 +08:00
}
await Task.WhenAll(tasks);
}
2025-04-30 09:50:50 +08:00
}
2025-04-18 09:29:38 +08:00
}