This repository is used to generate data for Akka.Persistence.Sql
backward compatibility test. It generates a standardized test data and package them inside a docker container.
- Akka.Persistence.MySql
- Akka.Persistence.PostgreSql
- Akka.Persistence.Sqlite
- Akka.Persistence SqlServer
- Persisted data types:
int
,string
,ShardedMessage
,CustomShardedMessage
ShardedMessage
contains a single int payload and saved using standard serializerCustomShardedMessage
contains a single int payload and saved using a custom serializerCustomSerializer
with serializer ID999
- Each data types are persisted using 0, 1, and 2 tags
- Tags are "Tag1" and "Tag2"
- Data are generated using a 3 node cluster into 100 entities.
The test entities are very simple, they contain 2 tracked states:
- Total: The aggregate total of all passed messages.
- Persisted: The total number of messages received by the entity.
Entity ID are generated from the int message itself using this formula:
int msg;
const int MaxEntities = 100;
string entityId = ((msg / 3) % MaxEntities).ToString();
A round of data generation is done by sending a sequence of [0..299] integer messages of each data type to the shard region actor. On each round, each entity will persist exactly 12 data consisting each data type in all the tag variants.
A full data generation is done in this exact order:
- Round of data generation.
- Save snapshot and delete journal.
- Round of data generation.
- Save snapshot.
- Round of data generation.
At the end of data generation, each entity should have persisted 36 messages and have 2 snapshots.
At the end of full data generation, the database journal, snapshot, and metadata table will contain data from both Sharding and Persistence.
var baseValue = persistentId * 3;
var roundTotal = (baseValue + baseValue + 1 + baseValue + 2) * 4;
Total = roundTotal * 3;
Persisted = 36;
int msg;
var tagCount = (msg % 3);
- The message is not tagged tagged if
msg % 3 == 0
, - tagged with
["Tag1"]
ifmsg % 3 == 1
, and - tagged with
["Tag1", "Tag2"]
whenmsg % 3 == 2
.
All the needed environment code are in the Akka.Persistence.Sql.Exporter.Shared
project. The start code automatically start a 3 node cluster with all the required configuration set.
void Setup(AkkaConfigurationBuilder builder, IServiceProvider provider)
{
var config = ConfigurationFactory.ParseString($@"
akka.persistence.journal {{
plugin = ""akka.persistence.journal.mysql""
mysql.connection-string = ""{docker.ConnectionString}""
}}
akka.persistence.snapshot-store {{
plugin = ""akka.persistence.snapshot-store.mysql""
mysql.connection-string = ""{docker.ConnectionString}""
}}").WithFallback(MySqlPersistence.DefaultConfiguration());
builder
.AddHocon(config);
}
await using var testCluster = new TestCluster(Setup, "mysql");
await testCluster.StartAsync();
- Change the plugin version in the .csproj file to the version you want to make a specific data dump for
- Run the
build.ps1
script.\build.ps1 all
to create all data docker images.\build.ps1 mysql
to create a MySql docker image.\build.ps1 postgresql
to create a PostgreSql docker image.\build.ps1 sqlite
to create a SqLite data file.\build.ps1 sqlserver
to create a MS SQL Server docker image