I want to use Proto.Mailbox.BatchingMailbox as a buffer for batch writing to a database. For example, I have several producers of messages and one persistence actor (it writes messages to the database). And I want that the persistence actor doesn't write each particular message to the database, but collect it in a buffer and after a special amount write it by batch to the database. I tried BatchingMailbox but it doesn't work.
ActorPublisher1 (produces a lot of messages)
ActorPublisher2 (produces a lot of messages)
ActorPublisher3 (produces a lot of messages)
||
||
||
\/
Buffer (size of 5 messages) in Persistence actor
I have several grain publishers
Somewhere in publisher
var spawning = _cluster.GetSpawningGrain("my-id");
spawning.SendMessageToPersistence(request)
one grain that gets all messages and spawns basic actor of persistence
public class SpawningGrain: SpawningGraingBase
{
public override async Task OnStarted()
{
var actorProps = Props.FromProducer(() => new PersistenceActor()).WithMailbox(() => new BatchingMailbox(5) );
Context.Spawn(actorProps);
}
public override Task SendMessageToPersistence(CreateRequest request)
{
foreach (var child in Context.Children)
{
Context.Send(child, request);
}
return Task.CompletedTask;
}
persistence actor writes batch data to database
public class PersistenceActor: IActor
{
public async Task ReceiveAsync(IContext context)
{
if (context.Message is List<object> batch)
{
await ProcessBatch(batch);
}
}
private async Task ProcessBatch(IList<object> batch)
{
// write to database
}
}