Skip to content

akkadotnet/akka-persistence-comparison

Akka.Persistence Benchmark Results

Test Environment

BenchmarkDotNet v0.15.4, Windows 10 (10.0.19045.6332/22H2/2022Update)
AMD Ryzen 9 3900X 3.79GHz, 1 CPU, 24 logical and 12 physical cores
.NET SDK 9.0.110
  [Host]  : .NET 9.0.9 (9.0.9, 9.0.925.41916), X64 RyuJIT x86-64-v3
  LongRun : .NET 9.0.9 (9.0.9, 9.0.925.41916), X64 RyuJIT x86-64-v3

Job=LongRun  EvaluateOverhead=False  Concurrent=True
Server=True  InvocationCount=1  IterationCount=10
LaunchCount=3  RunStrategy=Monitoring  UnrollFactor=1
WarmupCount=3

Azure Table Storage

Note

Akka.Persistence.Azure benchmark was run using Azurite emulator and not an actual Azure Storage, these benchmark results does not represent actual real world performance numbers.

Azure Group Persist Benchmark

Method BatchSize Mean Error StdDev msg/sec
Persist 1 NA NA NA
PersistAsync 1 NA NA NA
Persist 100 1.008 ms 0.2551 ms 0.3818 ms 991.91
PersistAsync 100 1.032 ms 0.2684 ms 0.4018 ms 968.57

Note: Benchmarks with issues for BatchSize=1

Azure Persist Benchmark

Method BatchSize Mean Error StdDev msg/sec
Persist 1 2,718.9 μs 142.66 μs 213.53 μs 367.80
PersistAsync 1 2,685.5 μs 111.16 μs 166.38 μs 372.37
Persist 100 277.2 μs 25.16 μs 37.66 μs 3,607.36
PersistAsync 100 283.8 μs 40.57 μs 60.73 μs 3,523.35

Azure Recovery Benchmark

Method Mean Error StdDev msg/sec
RecoveryBenchmarkMethod 30.85 μs 2.768 μs 4.143 μs 32,417.54

MongoDB

MongoDB Group Persist Benchmark

Method BatchSize Mean Error StdDev Median msg/sec
Persist 1 76.60 μs 10.226 μs 15.307 μs 73.260 μs 13,054.79
PersistAsync 1 76.47 μs 6.315 μs 9.451 μs 73.763 μs 13,077.38
Persist 100 12.73 μs 4.833 μs 7.233 μs 9.040 μs 78,582.94
PersistAsync 100 11.74 μs 4.216 μs 6.310 μs 8.960 μs 85,179.51

MongoDB Persist Benchmark

Method BatchSize Mean Error StdDev msg/sec
Persist 1 396.07 μs 60.553 μs 90.632 μs 2,524.80
PersistAsync 1 384.12 μs 55.282 μs 82.743 μs 2,603.38
Persist 100 48.56 μs 2.322 μs 3.476 μs 20,591.09
PersistAsync 100 48.24 μs 2.071 μs 3.099 μs 20,730.80

MongoDB Recovery Benchmark

Method Mean Error StdDev msg/sec
RecoveryBenchmarkMethod 30.76 μs 1.420 μs 2.126 μs 32,511.04

PostgreSQL

PostgreSQL Group Persist Benchmark

Method BatchSize Mean Error StdDev msg/sec
Persist 1 248.14 μs 15.827 μs 23.688 μs 4,030.00
PersistAsync 1 248.91 μs 16.294 μs 24.388 μs 4,017.59
Persist 100 22.24 μs 4.922 μs 7.367 μs 44,969.43
PersistAsync 100 21.50 μs 3.884 μs 5.813 μs 46,521.44

PostgreSQL Persist Benchmark

Method BatchSize Mean Error StdDev msg/sec
Persist 1 1,127.35 μs 50.388 μs 75.42 μs 887.04
PersistAsync 1 1,108.13 μs 43.096 μs 64.50 μs 902.42
Persist 100 46.10 μs 7.517 μs 11.25 μs 21,693.92
PersistAsync 100 54.10 μs 8.196 μs 12.27 μs 18,485.15

PostgreSQL Recovery Benchmark

Method Mean Error StdDev msg/sec
RecoveryBenchmarkMethod 15.81 μs 1.586 μs 2.373 μs 63,246.99

Redis

Redis Group Persist Benchmark

Method BatchSize Mean Error StdDev msg/sec
Persist 1 68.245 μs 4.1685 μs 6.2393 μs 14,653.11
PersistAsync 1 66.768 μs 4.1736 μs 6.2469 μs 14,977.15
Persist 100 6.114 μs 0.8959 μs 1.3410 μs 163,571.66
PersistAsync 100 5.844 μs 0.5898 μs 0.8828 μs 171,128.92

Redis Persist Benchmark

Method BatchSize Mean Error StdDev msg/sec
Persist 1 546.84 μs 22.830 μs 34.170 μs 1,828.68
PersistAsync 1 565.79 μs 33.090 μs 49.527 μs 1,767.45
Persist 100 17.32 μs 1.677 μs 2.511 μs 57,751.15
PersistAsync 100 16.84 μs 2.027 μs 3.034 μs 59,394.70

Redis Recovery Benchmark

Method Mean Error StdDev msg/sec
RecoveryBenchmarkMethod 10.36 μs 0.564 μs 0.845 μs 96,570.90

SQL Server

SQL Server Group Persist Benchmark

Method BatchSize Mean Error StdDev msg/sec
Persist 1 977.86 μs 41.547 μs 62.186 μs 1,022.64
PersistAsync 1 977.57 μs 41.637 μs 62.320 μs 1,022.94
Persist 100 73.32 μs 5.269 μs 7.886 μs 13,638.03
PersistAsync 100 72.80 μs 4.537 μs 6.790 μs 13,736.47

SQL Server Persist Benchmark

Method BatchSize Mean Error StdDev msg/sec
Persist 1 5,016.0 μs 186.50 μs 279.15 μs 199.36
PersistAsync 1 5,093.4 μs 302.33 μs 452.52 μs 196.33
Persist 100 141.3 μs 17.89 μs 26.78 μs 7,079.37
PersistAsync 100 139.9 μs 18.32 μs 27.42 μs 7,150.51

SQL Server Recovery Benchmark

Method Mean Error StdDev msg/sec
RecoveryBenchmarkMethod 39.89 μs 8.668 μs 12.97 μs 25,069.10

build-system-template

Akka.NET project build system template that provides standardized build and CI/CD configuration for all Akka.NET projects.

Build System Overview

This repository contains our standardized build system setup that can be used across all Akka.NET projects. Here are the key components and practices we follow:

CI/CD Configuration

We primarily use GitHub Actions for our CI/CD pipelines, but also maintain Azure DevOps pipeline examples. You can find the configuration examples in:

  • .github/workflows/ - GitHub Actions pipeline examples
  • .azuredevops/ - Azure DevOps pipeline examples

SDK Version Management

We use global.json to pin the .NET SDK version for both CI/CD environments and local development. This ensures consistent builds across all environments and developers.

.NET Tools

We use local .NET tools to enhance our build and documentation process. The tools are configured in .config/dotnet-tools.json and include:

  • Incrementalist (v1.0.0-beta4) - Used for determining which projects need to be rebuilt based on Git changes
  • DocFx (v2.78.3) - Used for generating documentation

To restore these tools in your local environment, run:

dotnet tool restore

This command is automatically executed in our CI/CD pipelines (both GitHub Actions and Azure DevOps) to ensure tools are available during builds.

Centralized Package and Build Management

We utilize two key MSBuild files for centralized configuration:

  1. Directory.Packages.props - Implements Central Package Version Management for consistent NuGet package versions across all projects in the solution.

  2. Directory.Build.props - Defines common build properties, including:

    • Copyright and author information
    • Source linking configuration
    • NuGet package metadata
    • Common compiler settings
    • Target framework definitions

Code Coverage Configuration

The coverlet.runsettings file configures code coverage collection using Coverlet, with settings for:

  • Multiple coverage report formats (JSON, Cobertura, LCOV, TeamCity, OpenCover)
  • Test assembly exclusions
  • Source linking integration
  • Performance optimizations

Release Management

Our release process is streamlined through:

  • RELEASE_NOTES.md - Contains version history and release notes
  • build.ps1 - PowerShell script that processes release notes and updates version information
  • Supporting scripts in /scripts:
    • bumpVersion.ps1 - Updates version numbers
    • getReleaseNotes.ps1 - Parses release notes

The build system primarily relies on standard dotnet CLI commands, with the PowerShell scripts mainly handling release note processing and version management.

Solution Format

We prefer the new .slnx XML-based solution format over the traditional .sln format. This requires .NET 9 SDK or later. The new format is more concise and easier to work with. You can migrate existing solutions using:

dotnet sln migrate

For more information about the new .slnx format, see the official announcement.

Getting Started

  1. Ensure you have the correct .NET SDK version installed (check global.json)
  2. Clone this repository
  3. Run dotnet build to verify the build system
  4. Customize the configuration files for your specific project needs

About

Comparative performance benchmarks for different Akka.Persistence implementations

Resources

License

Code of conduct

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •