0

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
    }
}
Iurii
  • 1

0 Answers0