-
Notifications
You must be signed in to change notification settings - Fork 30
/
Copy pathProgram.cs
96 lines (83 loc) · 3.43 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
using Microsoft.AspNetCore.Builder;
using Samples.Benchmark;
using Samples.Benchmark.Client;
using Samples.Benchmark.Server;
using Stl.Fusion.Server;
using Stl.Rpc;
using Stl.Rpc.Server;
#pragma warning disable ASP0000
// var minThreadCount = WorkerCount * 2;
// ThreadPool.SetMinThreads(minThreadCount, minThreadCount);
ThreadPool.SetMaxThreads(16_384, 16_384);
ByteSerializer.Default = MessagePackByteSerializer.Default; // Remove to switch back to MemoryPack
var stopCts = new CancellationTokenSource();
var cancellationToken = StopToken = stopCts.Token;
TreatControlCAsInput = false;
CancelKeyPress += (_, ea) => {
stopCts.Cancel();
ea.Cancel = true;
};
await (args switch {
[ "server" ] => RunServer(),
[ "client" ] => RunClient(),
_ => Task.WhenAll(RunServer(), RunClient()),
});
async Task RunServer()
{
var builder = WebApplication.CreateBuilder();
builder.Logging.ClearProviders()
.AddDebug()
.SetMinimumLevel(LogLevel.Warning);
// Core services
var services = builder.Services;
services.AddAppDbContext();
var fusion = services.AddFusion(RpcServiceMode.Server);
fusion.AddWebServer();
// Benchmark services
fusion.AddService<IFusionTestService, FusionTestService>();
fusion.Rpc.AddServer<IRpcTestService, IFusionTestService>();
// Build app & initialize DB
var app = builder.Build();
var dbInitializer = app.Services.GetRequiredService<DbInitializer>();
await dbInitializer.Initialize(true);
// Start Kestrel
app.Urls.Add(BaseUrl);
app.UseWebSockets();
app.MapRpcWebSocketServer();
app.MapTestService<DbTestService>("/api/dbTestService");
app.MapTestService<IFusionTestService>("/api/fusionTestService");
try {
await app.StartAsync(cancellationToken);
await TaskExt.NeverEndingTask.WaitAsync(cancellationToken);
}
catch (OperationCanceledException) { }
catch (Exception error) {
Error.WriteLine($"Server failed: {error.Message}");
}
}
async Task RunClient()
{
// Initialize
var dbServices = ClientServices.DbServices;
await ServerChecker.WhenReady(BaseUrl, cancellationToken);
await dbServices.GetRequiredService<DbInitializer>().Initialize(true, cancellationToken);
WriteLine($"Item count: {ItemCount}");
WriteLine($"Client concurrency: {TestServiceConcurrency} workers per client or test service");
WriteLine($"Writer count: {WriterCount}");
var benchmarkRunner = new BenchmarkRunner("Initialize", ClientServices.LocalDbServiceFactory);
await benchmarkRunner.Initialize(cancellationToken);
// Run
WriteLine();
WriteLine("Local services:");
await new BenchmarkRunner("Fusion Service", ClientServices.LocalFusionServiceFactory).Run();
await new BenchmarkRunner("Regular Service", ClientServices.LocalDbServiceFactory, 2).Run();
WriteLine();
WriteLine("Remote services:");
await new BenchmarkRunner("Fusion Client -> Fusion Service", ClientServices.RemoteFusionServiceFactory).Run();
await new BenchmarkRunner("Stl.Rpc Client -> Fusion Service", ClientServices.RemoteFusionServiceViaRpcFactory, 10).Run();
await new BenchmarkRunner("HTTP Client -> Fusion Service", ClientServices.RemoteFusionServiceViaHttpFactory, 5).Run();
await new BenchmarkRunner("HTTP Client -> Regular Service", ClientServices.RemoteDbServiceViaHttpFactory, 5).Run();
ReadKey();
// ReSharper disable once AccessToDisposedClosure
stopCts.Cancel();
}