Extract product-agnostic workflow engine from Ablera.Serdica.Workflow into standalone StellaOps.Workflow.* libraries targeting net10.0. Libraries (14): - Contracts, Abstractions (compiler, decompiler, expression runtime) - Engine (execution, signaling, scheduling, projections, hosted services) - ElkSharp (generic graph layout algorithm) - Renderer.ElkSharp, Renderer.ElkJs, Renderer.Msagl, Renderer.Svg - Signaling.Redis, Signaling.OracleAq - DataStore.MongoDB, DataStore.PostgreSQL, DataStore.Oracle WebService: ASP.NET Core Minimal API with 22 endpoints Tests (8 projects, 109 tests pass): - Engine.Tests (105 pass), WebService.Tests (4 E2E pass) - Renderer.Tests, DataStore.MongoDB/Oracle/PostgreSQL.Tests - Signaling.Redis.Tests, IntegrationTests.Shared Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
214 lines
6.6 KiB
JSON
214 lines
6.6 KiB
JSON
{
|
|
"Date": "2026-03-17",
|
|
"Workspace": "C:\\dev\\serdica-backend4",
|
|
"TestCommand": "dotnet test src/Serdica/Ablera.Serdica.Workflow/__Tests/Ablera.Serdica.Workflow.IntegrationTests/Ablera.Serdica.Workflow.IntegrationTests.csproj -c Release --no-build --filter \"FullyQualifiedName~PostgresPerformance\"",
|
|
"SuiteResult": {
|
|
"Passed": 11,
|
|
"Total": 11,
|
|
"Duration": "2 m 16 s"
|
|
},
|
|
"RawArtifactDirectory": "src/Serdica/Ablera.Serdica.Workflow/__Tests/Ablera.Serdica.Workflow.IntegrationTests/bin/Release/net9.0/TestResults/workflow-performance/",
|
|
"PostgresEnvironment": {
|
|
"DockerImage": "postgres:16-alpine",
|
|
"Database": "workflow",
|
|
"Version": "PostgreSQL 16.13",
|
|
"Backend": "Durable queue tables plus LISTEN/NOTIFY wake hints"
|
|
},
|
|
"MeasurementViews": {
|
|
"SerialLatencyScenario": "postgres-signal-roundtrip-latency-serial",
|
|
"SteadyThroughputScenario": "postgres-signal-roundtrip-throughput-parallel",
|
|
"CapacityScenarioPrefix": "postgres-signal-roundtrip-capacity-"
|
|
},
|
|
"Notes": {
|
|
"TopWaitCounts": [
|
|
{
|
|
"Name": "Client:ClientRead",
|
|
"Count": 13
|
|
},
|
|
{
|
|
"Name": "",
|
|
"Count": 1
|
|
}
|
|
],
|
|
"Interpretation": [
|
|
"Serial latency baseline and steady throughput baseline are separated from the capacity ladder.",
|
|
"The capacity ladder still scales through c16 on this local PostgreSQL Docker setup.",
|
|
"Immediate queue handling remains much cheaper than full workflow resume.",
|
|
"The dominant observed backend state is client read waiting, not an obvious storage stall."
|
|
]
|
|
},
|
|
"Scenarios": [
|
|
{
|
|
"ScenarioName": "postgres-signal-roundtrip-capacity-c1",
|
|
"Tier": "WorkflowPerfCapacity",
|
|
"OperationCount": 16,
|
|
"Concurrency": 1,
|
|
"DurationMilliseconds": 3895.54,
|
|
"ThroughputPerSecond": 4.11,
|
|
"AverageLatencyMilliseconds": 3738.08,
|
|
"P95LatencyMilliseconds": 3762.51,
|
|
"MaxLatencyMilliseconds": 3771.10,
|
|
"TopWait": "Client:ClientRead",
|
|
"CounterDeltas": {
|
|
"xact_commit": 251,
|
|
"xact_rollback": 7,
|
|
"blks_hit": 1654,
|
|
"blks_read": 24,
|
|
"tup_inserted": 48,
|
|
"tup_updated": 48,
|
|
"tup_deleted": 16
|
|
}
|
|
},
|
|
{
|
|
"ScenarioName": "postgres-signal-roundtrip-capacity-c4",
|
|
"Tier": "WorkflowPerfCapacity",
|
|
"OperationCount": 64,
|
|
"Concurrency": 4,
|
|
"DurationMilliseconds": 3700.99,
|
|
"ThroughputPerSecond": 17.29,
|
|
"AverageLatencyMilliseconds": 3577.49,
|
|
"P95LatencyMilliseconds": 3583.70,
|
|
"MaxLatencyMilliseconds": 3584.43,
|
|
"TopWait": "Client:ClientRead",
|
|
"CounterDeltas": {
|
|
"xact_commit": 1080,
|
|
"xact_rollback": 21,
|
|
"blks_hit": 7084,
|
|
"blks_read": 1,
|
|
"tup_inserted": 192,
|
|
"tup_updated": 192,
|
|
"tup_deleted": 64
|
|
}
|
|
},
|
|
{
|
|
"ScenarioName": "postgres-signal-roundtrip-capacity-c8",
|
|
"Tier": "WorkflowPerfCapacity",
|
|
"OperationCount": 128,
|
|
"Concurrency": 8,
|
|
"DurationMilliseconds": 3853.89,
|
|
"ThroughputPerSecond": 33.21,
|
|
"AverageLatencyMilliseconds": 3713.31,
|
|
"P95LatencyMilliseconds": 3718.66,
|
|
"MaxLatencyMilliseconds": 3719.34,
|
|
"TopWait": "Client:ClientRead",
|
|
"CounterDeltas": {
|
|
"xact_commit": 2348,
|
|
"xact_rollback": 44,
|
|
"blks_hit": 17069,
|
|
"blks_read": 0,
|
|
"tup_inserted": 384,
|
|
"tup_updated": 384,
|
|
"tup_deleted": 128
|
|
}
|
|
},
|
|
{
|
|
"ScenarioName": "postgres-signal-roundtrip-capacity-c16",
|
|
"Tier": "WorkflowPerfCapacity",
|
|
"OperationCount": 256,
|
|
"Concurrency": 16,
|
|
"DurationMilliseconds": 4488.07,
|
|
"ThroughputPerSecond": 57.04,
|
|
"AverageLatencyMilliseconds": 4251.48,
|
|
"P95LatencyMilliseconds": 4287.87,
|
|
"MaxLatencyMilliseconds": 4294.09,
|
|
"TopWait": "Client:ClientRead",
|
|
"CounterDeltas": {
|
|
"xact_commit": 4536,
|
|
"xact_rollback": 48,
|
|
"blks_hit": 40443,
|
|
"blks_read": 0,
|
|
"tup_inserted": 768,
|
|
"tup_updated": 768,
|
|
"tup_deleted": 256
|
|
}
|
|
},
|
|
{
|
|
"ScenarioName": "postgres-signal-roundtrip-latency-serial",
|
|
"Tier": "WorkflowPerfLatency",
|
|
"OperationCount": 16,
|
|
"Concurrency": 1,
|
|
"DurationMilliseconds": 49290.47,
|
|
"ThroughputPerSecond": 0.32,
|
|
"AverageLatencyMilliseconds": 3079.33,
|
|
"P95LatencyMilliseconds": 3094.94,
|
|
"MaxLatencyMilliseconds": 3101.71,
|
|
"PhaseLatencySummaries": {
|
|
"start": {
|
|
"AverageMilliseconds": 6.12,
|
|
"P95Milliseconds": 9.29,
|
|
"MaxMilliseconds": 11.26
|
|
},
|
|
"signalPublish": {
|
|
"AverageMilliseconds": 5.63,
|
|
"P95Milliseconds": 6.82,
|
|
"MaxMilliseconds": 7.53
|
|
},
|
|
"signalToCompletion": {
|
|
"AverageMilliseconds": 3073.20,
|
|
"P95Milliseconds": 3086.59,
|
|
"MaxMilliseconds": 3090.44
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"ScenarioName": "postgres-signal-roundtrip-throughput-parallel",
|
|
"Tier": "WorkflowPerfThroughput",
|
|
"OperationCount": 96,
|
|
"Concurrency": 16,
|
|
"DurationMilliseconds": 3729.17,
|
|
"ThroughputPerSecond": 25.74,
|
|
"AverageLatencyMilliseconds": 3603.54,
|
|
"P95LatencyMilliseconds": 3635.59,
|
|
"MaxLatencyMilliseconds": 3649.96,
|
|
"TopWait": "Client:ClientRead",
|
|
"CounterDeltas": {
|
|
"xact_commit": 1502,
|
|
"xact_rollback": 38,
|
|
"blks_hit": 21978,
|
|
"blks_read": 24,
|
|
"tup_inserted": 288,
|
|
"tup_updated": 288,
|
|
"tup_deleted": 96
|
|
},
|
|
"PhaseLatencySummaries": {
|
|
"start": {
|
|
"AverageMilliseconds": 16.21,
|
|
"P95Milliseconds": 40.31,
|
|
"MaxMilliseconds": 47.02
|
|
},
|
|
"signalPublish": {
|
|
"AverageMilliseconds": 18.11,
|
|
"P95Milliseconds": 23.62,
|
|
"MaxMilliseconds": 28.41
|
|
},
|
|
"signalToCompletion": {
|
|
"AverageMilliseconds": 3504.24,
|
|
"P95Milliseconds": 3530.38,
|
|
"MaxMilliseconds": 3531.14
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"ScenarioName": "postgres-signal-roundtrip-soak",
|
|
"Tier": "WorkflowPerfSoak",
|
|
"OperationCount": 108,
|
|
"Concurrency": 8,
|
|
"DurationMilliseconds": 25121.68,
|
|
"ThroughputPerSecond": 4.30,
|
|
"AverageLatencyMilliseconds": 4164.52,
|
|
"P95LatencyMilliseconds": 4208.42,
|
|
"MaxLatencyMilliseconds": 4209.96,
|
|
"TopWait": "Client:ClientRead",
|
|
"CounterDeltas": {
|
|
"xact_commit": 3313,
|
|
"xact_rollback": 352,
|
|
"blks_hit": 26548,
|
|
"blks_read": 269,
|
|
"tup_inserted": 774,
|
|
"tup_updated": 339,
|
|
"tup_deleted": 108
|
|
}
|
|
}
|
|
]
|
|
}
|