From f0f61884b76a1c6d3e44c194912bf8e052a1be15 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 28 Sep 2021 23:43:48 +0800 Subject: [PATCH] Improve performance --- .../DistributedEvents/DbContextEventInbox.cs | 26 ++++++++--------- .../DistributedEvents/DbContextEventOutbox.cs | 10 +++---- .../MongoDbContextEventInbox.cs | 28 +++++++++---------- .../MongoDbContextEventOutbox.cs | 6 ++-- 4 files changed, 31 insertions(+), 39 deletions(-) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DistributedEvents/DbContextEventInbox.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DistributedEvents/DbContextEventInbox.cs index 86fc78cab3..5bee24d754 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DistributedEvents/DbContextEventInbox.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DistributedEvents/DbContextEventInbox.cs @@ -57,35 +57,31 @@ namespace Volo.Abp.EntityFrameworkCore.DistributedEvents } [UnitOfWork] - public async Task MarkAsProcessedAsync(Guid id) + public virtual async Task MarkAsProcessedAsync(Guid id) { - //TODO: Optimize? var dbContext = await DbContextProvider.GetDbContextAsync(); - var incomingEvent = await dbContext.IncomingEvents.FindAsync(id); - if (incomingEvent != null) - { - incomingEvent.MarkAsProcessed(Clock.Now); - } + var tableName = dbContext.IncomingEvents.EntityType.GetSchemaQualifiedTableName(); + + var sql = $"UPDATE {tableName} SET Processed = 1, ProcessedTime = '{Clock.Now}' WHERE Id = '{id}'"; + await dbContext.Database.ExecuteSqlRawAsync(sql); } [UnitOfWork] - public async Task ExistsByMessageIdAsync(string messageId) + public virtual async Task ExistsByMessageIdAsync(string messageId) { - //TODO: Optimize var dbContext = await DbContextProvider.GetDbContextAsync(); return await dbContext.IncomingEvents.AnyAsync(x => x.MessageId == messageId); } [UnitOfWork] - public async Task DeleteOldEventsAsync() + public virtual async Task DeleteOldEventsAsync() { - //TODO: Optimize var dbContext = await DbContextProvider.GetDbContextAsync(); + var tableName = dbContext.IncomingEvents.EntityType.GetSchemaQualifiedTableName(); var timeToKeepEvents = Clock.Now.Add(DistributedEventsOptions.InboxKeepEventTimeSpan); - var oldEvents = await dbContext.IncomingEvents - .Where(x => x.Processed && x.CreationTime < timeToKeepEvents) - .ToListAsync(); - dbContext.IncomingEvents.RemoveRange(oldEvents); + + var sql = $"DELETE FROM {tableName} WHERE Processed = 1 AND CreationTime < '{timeToKeepEvents}'"; + await dbContext.Database.ExecuteSqlRawAsync(sql); } } } diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DistributedEvents/DbContextEventOutbox.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DistributedEvents/DbContextEventOutbox.cs index 435bc70398..f0b4d3b98c 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DistributedEvents/DbContextEventOutbox.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DistributedEvents/DbContextEventOutbox.cs @@ -49,13 +49,11 @@ namespace Volo.Abp.EntityFrameworkCore.DistributedEvents [UnitOfWork] public virtual async Task DeleteAsync(Guid id) { - //TODO: Optimize? var dbContext = (IHasEventOutbox) await DbContextProvider.GetDbContextAsync(); - var outgoingEvent = await dbContext.OutgoingEvents.FindAsync(id); - if (outgoingEvent != null) - { - dbContext.Remove(outgoingEvent); - } + var tableName = dbContext.OutgoingEvents.EntityType.GetSchemaQualifiedTableName(); + + var sql = $"DELETE FROM {tableName} WHERE Id = '{id}'"; + await dbContext.Database.ExecuteSqlRawAsync(sql); } } } diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DistributedEvents/MongoDbContextEventInbox.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DistributedEvents/MongoDbContextEventInbox.cs index 886a7744d1..62927d2279 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DistributedEvents/MongoDbContextEventInbox.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DistributedEvents/MongoDbContextEventInbox.cs @@ -68,34 +68,32 @@ namespace Volo.Abp.MongoDB.DistributedEvents } [UnitOfWork] - public async Task MarkAsProcessedAsync(Guid id) + public virtual async Task MarkAsProcessedAsync(Guid id) { var dbContext = await DbContextProvider.GetDbContextAsync(); - var incomingEvent = await dbContext.IncomingEvents.Find(x => x.Id.Equals(id)).FirstOrDefaultAsync(); - if (incomingEvent != null) - { - incomingEvent.MarkAsProcessed(Clock.Now); - if (dbContext.SessionHandle != null) - { - await dbContext.IncomingEvents.ReplaceOneAsync(dbContext.SessionHandle, Builders.Filter.Eq(e => e.Id, incomingEvent.Id), incomingEvent); - } - else - { - await dbContext.IncomingEvents.ReplaceOneAsync(Builders.Filter.Eq(e => e.Id, incomingEvent.Id), incomingEvent); - } + var filter = Builders.Filter.Eq(x => x.Id, id); + var update = Builders.Update.Set(x => x.Processed, true).Set(x => x.ProcessedTime, Clock.Now); + + if (dbContext.SessionHandle != null) + { + await dbContext.IncomingEvents.UpdateOneAsync(dbContext.SessionHandle, filter, update); + } + else + { + await dbContext.IncomingEvents.UpdateOneAsync(filter, update); } } [UnitOfWork] - public async Task ExistsByMessageIdAsync(string messageId) + public virtual async Task ExistsByMessageIdAsync(string messageId) { var dbContext = await DbContextProvider.GetDbContextAsync(); return await dbContext.IncomingEvents.AsQueryable().AnyAsync(x => x.MessageId == messageId); } [UnitOfWork] - public async Task DeleteOldEventsAsync() + public virtual async Task DeleteOldEventsAsync() { var dbContext = await DbContextProvider.GetDbContextAsync(); var timeToKeepEvents = Clock.Now.Add(DistributedEventsOptions.InboxKeepEventTimeSpan); diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DistributedEvents/MongoDbContextEventOutbox.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DistributedEvents/MongoDbContextEventOutbox.cs index df8aa108ee..dad0294d1c 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DistributedEvents/MongoDbContextEventOutbox.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/MongoDB/DistributedEvents/MongoDbContextEventOutbox.cs @@ -21,7 +21,7 @@ namespace Volo.Abp.MongoDB.DistributedEvents } [UnitOfWork] - public async Task EnqueueAsync(OutgoingEventInfo outgoingEvent) + public virtual async Task EnqueueAsync(OutgoingEventInfo outgoingEvent) { var dbContext = (IHasEventOutbox) await MongoDbContextProvider.GetDbContextAsync(); if (dbContext.SessionHandle != null) @@ -40,7 +40,7 @@ namespace Volo.Abp.MongoDB.DistributedEvents } [UnitOfWork] - public async Task> GetWaitingEventsAsync(int maxCount, CancellationToken cancellationToken = default) + public virtual async Task> GetWaitingEventsAsync(int maxCount, CancellationToken cancellationToken = default) { var dbContext = (IHasEventOutbox) await MongoDbContextProvider.GetDbContextAsync(cancellationToken); @@ -56,7 +56,7 @@ namespace Volo.Abp.MongoDB.DistributedEvents } [UnitOfWork] - public async Task DeleteAsync(Guid id) + public virtual async Task DeleteAsync(Guid id) { var dbContext = (IHasEventOutbox) await MongoDbContextProvider.GetDbContextAsync(); if (dbContext.SessionHandle != null)