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
|
|
|
|
}
|