From d84277586911f27a127a7a5e59970de1091beb2e Mon Sep 17 00:00:00 2001 From: Mark Cilia Vincenti Date: Tue, 13 Dec 2022 14:31:49 +0100 Subject: [PATCH 01/16] Switched to AsyncKeyedLock library which offers better performance and lower memory use. --- .../Erm.Messaging.Saga.csproj | 1 + .../src/Erm.Messaging.Saga/KeyedLocker.cs | 77 ------------------- .../src/Erm.Messaging.Saga/SagaCoordinator.cs | 2 +- 3 files changed, 2 insertions(+), 78 deletions(-) delete mode 100644 src/Saga/src/Erm.Messaging.Saga/KeyedLocker.cs diff --git a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj index 0103ba7..d961f72 100644 --- a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj +++ b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj @@ -7,6 +7,7 @@ + diff --git a/src/Saga/src/Erm.Messaging.Saga/KeyedLocker.cs b/src/Saga/src/Erm.Messaging.Saga/KeyedLocker.cs deleted file mode 100644 index d122a15..0000000 --- a/src/Saga/src/Erm.Messaging.Saga/KeyedLocker.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace Erm.Messaging.Saga; - -//Todo: Process synchronization; memory kullanımı ve performansı test edilmeli veya daha güvenilir bir implementation (battle tested) araştırılmalı. -//source -> https://stackoverflow.com/a/31194647/993434 -public sealed class KeyedLocker -{ - private static readonly Dictionary?> SemaphoreSlims = new(); - - // ReSharper disable once MemberCanBeMadeStatic.Local - private SemaphoreSlim GetOrCreate(object key) - { - RefCounted? item; - lock (SemaphoreSlims) - { - if (SemaphoreSlims.TryGetValue(key, out item)) - { - ++item!.RefCount; - } - else - { - item = new RefCounted(new SemaphoreSlim(1, 1)); - SemaphoreSlims[key] = item; - } - } - - return item.Value; - } - - public async Task Lock(object key) - { - await GetOrCreate(key).WaitAsync().ConfigureAwait(false); - return new Releaser(key); - } - - private sealed class RefCounted - { - public RefCounted(T value) - { - RefCount = 1; - Value = value; - } - - public int RefCount { get; set; } - public T Value { get; } - } - - private sealed class Releaser : IDisposable - { - public Releaser(object key) - { - Key = key; - } - - private object Key { get; } - - public void Dispose() - { - RefCounted? item; - lock (SemaphoreSlims) - { - item = SemaphoreSlims[Key]; - --item!.RefCount; - if (item.RefCount is 0) - { - SemaphoreSlims.Remove(Key); - } - } - - item.Value.Release(); - } - } -} \ No newline at end of file diff --git a/src/Saga/src/Erm.Messaging.Saga/SagaCoordinator.cs b/src/Saga/src/Erm.Messaging.Saga/SagaCoordinator.cs index 355836e..681e74b 100644 --- a/src/Saga/src/Erm.Messaging.Saga/SagaCoordinator.cs +++ b/src/Saga/src/Erm.Messaging.Saga/SagaCoordinator.cs @@ -12,7 +12,7 @@ internal sealed class SagaCoordinator : ISagaCoordinator private readonly ISagaInitializer _initializer; private readonly ISagaProcessor _processor; private readonly ILogger _logger; - private static readonly KeyedLocker Locker = new(); + private static readonly AsyncKeyedLocker Locker = new(); public SagaCoordinator(ISagaLocator locator, ISagaInitializer initializer, From b6e9ffe783638a51ac48534f216edfc99a261756 Mon Sep 17 00:00:00 2001 From: Mark Cilia Vincenti Date: Tue, 13 Dec 2022 16:03:43 +0100 Subject: [PATCH 02/16] fix --- src/Saga/src/Erm.Messaging.Saga/SagaCoordinator.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Saga/src/Erm.Messaging.Saga/SagaCoordinator.cs b/src/Saga/src/Erm.Messaging.Saga/SagaCoordinator.cs index 681e74b..5a4b363 100644 --- a/src/Saga/src/Erm.Messaging.Saga/SagaCoordinator.cs +++ b/src/Saga/src/Erm.Messaging.Saga/SagaCoordinator.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Erm.Messaging; +using AsyncKeyedLock; namespace Erm.Messaging.Saga; @@ -58,7 +59,7 @@ private async Task Process( var sagaId = saga.GetSagaId(context, envelope, action is ISagaStartAction); using (_logger.BeginScope("Saga {SagaType}[{SagaId}]", saga.GetType().FullName, sagaId)) { - using (await Locker.Lock(sagaId)) + using (await Locker.LockAsync(sagaId).ConfigureAwait(false)) { var (initialized, state) = await _initializer.TryInitialize(saga, sagaId).ConfigureAwait(false); if (!initialized) From 64b82a8d6e59a3972a0858fd6fe838bec41d2b33 Mon Sep 17 00:00:00 2001 From: Mark Cilia Vincenti Date: Fri, 16 Dec 2022 14:44:17 +0100 Subject: [PATCH 03/16] Update to AsyncKeyedLock 5.1.2 --- src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj index d961f72..1a8aff5 100644 --- a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj +++ b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj @@ -7,7 +7,7 @@ - + From 9492f7f6ad2ca6aff383ea7b394015493d2273b0 Mon Sep 17 00:00:00 2001 From: Mark Cilia Vincenti Date: Sat, 17 Dec 2022 19:23:07 +0100 Subject: [PATCH 04/16] Update to AsyncKeyedLock 6.0.0 --- src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj index 1a8aff5..ac4a237 100644 --- a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj +++ b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj @@ -7,7 +7,7 @@ - + From e526a823a4a505eb97d7a207d667f1b6f1fac457 Mon Sep 17 00:00:00 2001 From: Mark Cilia Vincenti Date: Sat, 17 Dec 2022 23:33:05 +0100 Subject: [PATCH 05/16] Update Erm.Messaging.Saga.csproj --- src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj index ac4a237..12e272a 100644 --- a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj +++ b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj @@ -7,7 +7,7 @@ - + From b3f0bcd151ec42449f2e5d3ff809fff7054a6d7f Mon Sep 17 00:00:00 2001 From: Mark Cilia Vincenti Date: Sun, 18 Dec 2022 09:26:27 +0100 Subject: [PATCH 06/16] Update to AsyncKeyedLock 6.0.2 --- src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj index 12e272a..b270b3a 100644 --- a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj +++ b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj @@ -7,7 +7,7 @@ - + From 938638a2a47403e1714dbc5bda86ed247676df49 Mon Sep 17 00:00:00 2001 From: Mark Cilia Vincenti Date: Thu, 29 Dec 2022 09:51:48 +0100 Subject: [PATCH 07/16] Update AsyncKeyedLocker to 6.0.3 --- src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj index b270b3a..ff187ae 100644 --- a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj +++ b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj @@ -7,7 +7,7 @@ - + From 8127c611fbfc2298eeb9482103cec8e3da315a27 Mon Sep 17 00:00:00 2001 From: Mark Cilia Vincenti Date: Fri, 30 Dec 2022 14:34:13 +0100 Subject: [PATCH 08/16] Update to AsyncKeyedLock 6.0.4 --- src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj index ff187ae..8e23a19 100644 --- a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj +++ b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj @@ -7,7 +7,7 @@ - + From bab60a484c13520d3811a6b9727d292f1139a0c5 Mon Sep 17 00:00:00 2001 From: Mark Cilia Vincenti Date: Mon, 2 Jan 2023 09:07:50 +0100 Subject: [PATCH 09/16] Update to AsyncKeyedLock 6.0.5 --- src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj index 8e23a19..e2729dd 100644 --- a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj +++ b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj @@ -7,7 +7,7 @@ - + From 614334e8b75d80903b2066fef83ebaf9579dec9c Mon Sep 17 00:00:00 2001 From: Mark Cilia Vincenti Date: Thu, 26 Jan 2023 09:30:19 +0100 Subject: [PATCH 10/16] Update to AsyncKeyedLock 6.1.0 --- src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj index e2729dd..3fd607e 100644 --- a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj +++ b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj @@ -7,7 +7,7 @@ - + From db85bf559cc352f84bd8eaa15812302d0c410b5d Mon Sep 17 00:00:00 2001 From: Mark Cilia Vincenti Date: Fri, 27 Jan 2023 19:12:41 +0100 Subject: [PATCH 11/16] Update to AsyncKeyedLock 6.1.1 --- src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj index 3fd607e..e5facf6 100644 --- a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj +++ b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj @@ -7,7 +7,7 @@ - + From d2b3677aa1a6449ae654c131df7e667f407e346d Mon Sep 17 00:00:00 2001 From: Mark Cilia Vincenti Date: Sat, 25 Feb 2023 14:22:13 +0100 Subject: [PATCH 12/16] Update to AsyncKeyedLock 6.2.0 --- src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj index e5facf6..13f1262 100644 --- a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj +++ b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj @@ -7,7 +7,7 @@ - + From 3cf99ed667b2676a2f7160e70a65cc0cb610bdb4 Mon Sep 17 00:00:00 2001 From: Mark Cilia Vincenti Date: Mon, 10 Apr 2023 09:35:48 +0200 Subject: [PATCH 13/16] Update SagaCoordinator.cs --- src/Saga/src/Erm.Messaging.Saga/SagaCoordinator.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Saga/src/Erm.Messaging.Saga/SagaCoordinator.cs b/src/Saga/src/Erm.Messaging.Saga/SagaCoordinator.cs index 5a4b363..fb028c2 100644 --- a/src/Saga/src/Erm.Messaging.Saga/SagaCoordinator.cs +++ b/src/Saga/src/Erm.Messaging.Saga/SagaCoordinator.cs @@ -13,7 +13,10 @@ internal sealed class SagaCoordinator : ISagaCoordinator private readonly ISagaInitializer _initializer; private readonly ISagaProcessor _processor; private readonly ILogger _logger; - private static readonly AsyncKeyedLocker Locker = new(); + private static readonly AsyncKeyedLocker Locker = new(o => { + o.PoolSize = 20; + o.PoolInitialFill = 1; + }); public SagaCoordinator(ISagaLocator locator, ISagaInitializer initializer, @@ -78,4 +81,4 @@ private async Task Process( } } } -} \ No newline at end of file +} From 0796ddaaed2f7bcdc39b89083857469c76c92955 Mon Sep 17 00:00:00 2001 From: Mark Cilia Vincenti Date: Mon, 10 Apr 2023 09:36:04 +0200 Subject: [PATCH 14/16] Update Erm.Messaging.Saga.csproj --- src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj index 13f1262..1f88b81 100644 --- a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj +++ b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj @@ -7,7 +7,7 @@ - + From 494212ad4592a87be1fd034d4fa2c678cadc0d69 Mon Sep 17 00:00:00 2001 From: Mark Cilia Vincenti Date: Mon, 10 Apr 2023 09:42:00 +0200 Subject: [PATCH 15/16] Update SagaCoordinator.cs --- src/Saga/src/Erm.Messaging.Saga/SagaCoordinator.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Saga/src/Erm.Messaging.Saga/SagaCoordinator.cs b/src/Saga/src/Erm.Messaging.Saga/SagaCoordinator.cs index fb028c2..67484cd 100644 --- a/src/Saga/src/Erm.Messaging.Saga/SagaCoordinator.cs +++ b/src/Saga/src/Erm.Messaging.Saga/SagaCoordinator.cs @@ -13,7 +13,8 @@ internal sealed class SagaCoordinator : ISagaCoordinator private readonly ISagaInitializer _initializer; private readonly ISagaProcessor _processor; private readonly ILogger _logger; - private static readonly AsyncKeyedLocker Locker = new(o => { + private static readonly AsyncKeyedLocker Locker = new(o => + { o.PoolSize = 20; o.PoolInitialFill = 1; }); From 677d9159fe5de914eaa4ef072fb5c4e5e9d5c92f Mon Sep 17 00:00:00 2001 From: Mark Cilia Vincenti Date: Sat, 3 Feb 2024 17:15:47 +0100 Subject: [PATCH 16/16] Bump AsyncKeyedLock to 6.3.4 --- src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj index 1f88b81..adff784 100644 --- a/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj +++ b/src/Saga/src/Erm.Messaging.Saga/Erm.Messaging.Saga.csproj @@ -7,7 +7,7 @@ - +