From d8e603f1e41eb5f305bf41a4897124daebad26d3 Mon Sep 17 00:00:00 2001 From: Dominic Hickie Date: Thu, 5 Sep 2024 09:55:00 +0100 Subject: [PATCH] Implement sparse outstanding index for dynamo DB outbox --- Docker/dynamodb/shared-local-instance.db | Bin 552960 -> 0 bytes .../DynamoDbOutbox.cs | 45 +++++++------- ...yTopicOutstandingCreatedTimeExpression.cs} | 8 +-- .../MessageItem.cs | 9 ++- ..._are_outstanding_messages_in_the_outbox.cs | 58 ++++++++++++++++-- 5 files changed, 88 insertions(+), 32 deletions(-) delete mode 100644 Docker/dynamodb/shared-local-instance.db rename src/Paramore.Brighter.Outbox.DynamoDB/{KeyTopicCreatedTimeExpression.cs => KeyTopicOutstandingCreatedTimeExpression.cs} (72%) diff --git a/Docker/dynamodb/shared-local-instance.db b/Docker/dynamodb/shared-local-instance.db deleted file mode 100644 index 61ffe69ab1cf6a7084b11f212b6d083f8ea06c2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 552960 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%0Av8w^9SvXzDFguvWK~TCU{8cMG%u?lfo+6{*1#u7 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

fDP%WC4GG@oxDRZ$(m0i>9X0|5%3(6FYH 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 XS{EISx~YcFt81njUXcs6oND|(oD&pB diff --git a/src/Paramore.Brighter.Outbox.DynamoDB/DynamoDbOutbox.cs b/src/Paramore.Brighter.Outbox.DynamoDB/DynamoDbOutbox.cs index 17efcd774..1943ad7ec 100644 --- a/src/Paramore.Brighter.Outbox.DynamoDB/DynamoDbOutbox.cs +++ b/src/Paramore.Brighter.Outbox.DynamoDB/DynamoDbOutbox.cs @@ -365,7 +365,7 @@ await _context.SaveAsync( message, _dynamoOverwriteTableConfig, cancellationToken).ConfigureAwait(ContinueOnCapturedContext); - } + } ///

/// Marks a set of messages as dispatched in the Outbox @@ -404,13 +404,16 @@ public void MarkDispatched(string id, RequestContext requestContext, DateTimeOff message, _dynamoOverwriteTableConfig) .Wait(_configuration.Timeout); - } private static void MarkMessageDispatched(DateTimeOffset dispatchedAt, MessageItem message) { message.DeliveryTime = dispatchedAt.Ticks; message.DeliveredAt = dispatchedAt.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"); + + // Set the outstanding created time to null to remove the attribute + // from the item in dynamo + message.OutstandingCreatedTime = null; } /// @@ -423,11 +426,11 @@ private static void MarkMessageDispatched(DateTimeOffset dispatchedAt, MessageIt /// /// A list of messages that are outstanding for dispatch public IEnumerable OutstandingMessages( - TimeSpan dispatchedSince, - RequestContext requestContext, - int pageSize = 100, - int pageNumber = 1, - Dictionary args = null) + TimeSpan dispatchedSince, + RequestContext requestContext, + int pageSize = 100, + int pageNumber = 1, + Dictionary args = null) { return OutstandingMessagesAsync(dispatchedSince, requestContext, pageSize, pageNumber, args) .GetAwaiter() @@ -584,20 +587,20 @@ private async Task> OutstandingMessagesForTopicAsync(TimeSp return queryResult.Messages.Select(msg => msg.ConvertToMessage()); } - private Task AddToTransactionWrite(MessageItem messageToStore, DynamoDbUnitOfWork dynamoDbUnitOfWork) - { - var tcs = new TaskCompletionSource(); - var attributes = _context.ToDocument(messageToStore, _dynamoOverwriteTableConfig).ToAttributeMap(); - - var transaction = dynamoDbUnitOfWork.GetTransaction(); - transaction.TransactItems.Add(new TransactWriteItem{Put = new Put{TableName = _configuration.TableName, Item = attributes}}); - tcs.SetResult(transaction); - return tcs.Task; - } + private Task AddToTransactionWrite(MessageItem messageToStore, DynamoDbUnitOfWork dynamoDbUnitOfWork) + { + var tcs = new TaskCompletionSource(); + var attributes = _context.ToDocument(messageToStore, _dynamoOverwriteTableConfig).ToAttributeMap(); + + var transaction = dynamoDbUnitOfWork.GetTransaction(); + transaction.TransactItems.Add(new TransactWriteItem{Put = new Put{TableName = _configuration.TableName, Item = attributes}}); + tcs.SetResult(transaction); + return tcs.Task; + } private async Task GetMessage(string id, CancellationToken cancellationToken = default) { - MessageItem messageItem = await _context.LoadAsync(id, _dynamoOverwriteTableConfig, cancellationToken); + var messageItem = await _context.LoadAsync(id, _dynamoOverwriteTableConfig, cancellationToken); return messageItem?.ConvertToMessage() ?? new Message(); } @@ -734,14 +737,10 @@ private async Task PageOutstandingMessagesToBatc { do { - // We get all the messages for topic, added within a time range - // There should be few enough of those that we can efficiently filter for those - // that don't have a delivery date. var queryConfig = new QueryOperationConfig { IndexName = _configuration.OutstandingIndexName, - KeyExpression = new KeyTopicCreatedTimeExpression().Generate(topicName, olderThan, shard), - FilterExpression = new NoDispatchTimeExpression().Generate(), + KeyExpression = new KeyTopicOutstandingCreatedTimeExpression().Generate(topicName, olderThan, shard), Limit = batchSize - results.Count, PaginationToken = paginationToken, ConsistentRead = false diff --git a/src/Paramore.Brighter.Outbox.DynamoDB/KeyTopicCreatedTimeExpression.cs b/src/Paramore.Brighter.Outbox.DynamoDB/KeyTopicOutstandingCreatedTimeExpression.cs similarity index 72% rename from src/Paramore.Brighter.Outbox.DynamoDB/KeyTopicCreatedTimeExpression.cs rename to src/Paramore.Brighter.Outbox.DynamoDB/KeyTopicOutstandingCreatedTimeExpression.cs index af1f2902f..fbff217e9 100644 --- a/src/Paramore.Brighter.Outbox.DynamoDB/KeyTopicCreatedTimeExpression.cs +++ b/src/Paramore.Brighter.Outbox.DynamoDB/KeyTopicOutstandingCreatedTimeExpression.cs @@ -4,13 +4,13 @@ namespace Paramore.Brighter.Outbox.DynamoDB { - internal class KeyTopicCreatedTimeExpression + internal class KeyTopicOutstandingCreatedTimeExpression { private readonly Expression _expression; - public KeyTopicCreatedTimeExpression() + public KeyTopicOutstandingCreatedTimeExpression() { - _expression = new Expression { ExpressionStatement = "TopicShard = :v_TopicShard and CreatedTime < :v_CreatedTime" }; + _expression = new Expression { ExpressionStatement = "TopicShard = :v_TopicShard and OutstandingCreatedTime < :v_OutstandingCreatedTime" }; } public override string ToString() @@ -22,7 +22,7 @@ public Expression Generate(string topicName, DateTimeOffset createdTime, int sha { var values = new Dictionary(); values.Add(":v_TopicShard", $"{topicName}_{shard}"); - values.Add(":v_CreatedTime", createdTime.Ticks); + values.Add(":v_OutstandingCreatedTime", createdTime.Ticks); _expression.ExpressionAttributeValues = values; diff --git a/src/Paramore.Brighter.Outbox.DynamoDB/MessageItem.cs b/src/Paramore.Brighter.Outbox.DynamoDB/MessageItem.cs index 428fe1dfa..377e9075a 100644 --- a/src/Paramore.Brighter.Outbox.DynamoDB/MessageItem.cs +++ b/src/Paramore.Brighter.Outbox.DynamoDB/MessageItem.cs @@ -42,10 +42,16 @@ public class MessageItem /// /// The time at which the message was created, in ticks /// - [DynamoDBGlobalSecondaryIndexRangeKey(indexName: "Outstanding")] [DynamoDBProperty] public long CreatedTime { get; set; } + /// + /// The time at which the message was created, in ticks. Null if the message has been dispatched. + /// + [DynamoDBGlobalSecondaryIndexRangeKey(indexName: "Outstanding")] + [DynamoDBProperty] + public long? OutstandingCreatedTime { get; set; } + /// /// The time at which the message was delivered, formatted as a string yyyy-MM-dd /// @@ -123,6 +129,7 @@ public MessageItem(Message message, int shard = 0, long? expiresAt = null) CharacterEncoding = message.Body.CharacterEncoding.ToString(); CreatedAt = date.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"); CreatedTime = date.Ticks; + OutstandingCreatedTime = date.Ticks; DeliveryTime = 0; HeaderBag = JsonSerializer.Serialize(message.Header.Bag, JsonSerialisationOptions.Options); MessageId = message.Id.ToString(); diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/When_there_are_outstanding_messages_in_the_outbox.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/When_there_are_outstanding_messages_in_the_outbox.cs index 7035856ba..65a57a65b 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/When_there_are_outstanding_messages_in_the_outbox.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/When_there_are_outstanding_messages_in_the_outbox.cs @@ -42,7 +42,7 @@ public async Task When_there_are_outstanding_messages_in_the_outbox_async() } [Fact] - public async Task When_there_are_outstanding_messages_in_the_outbox() + public void When_there_are_outstanding_messages_in_the_outbox() { var context = new RequestContext(); _dynamoDbOutbox.Add(_message, context); @@ -87,7 +87,7 @@ public async Task When_there_are_outstanding_messages_for_multiple_topics_async( } [Fact] - public async Task When_there_are_outstanding_messages_for_multiple_topics() + public void When_there_are_outstanding_messages_for_multiple_topics() { var messages = new List(); var context = new RequestContext(); @@ -149,7 +149,7 @@ public async Task When_there_are_multiple_pages_of_outstanding_messages_for_a_to } [Fact] - public async Task When_there_are_multiple_pages_of_outstanding_messages_for_a_topic() + public void When_there_are_multiple_pages_of_outstanding_messages_for_a_topic() { var context = new RequestContext(); var messages = new List(); @@ -227,7 +227,7 @@ public async Task When_there_are_multiple_pages_of_outstanding_messages_for_all_ } [Fact] - public async Task When_there_are_multiple_pages_of_outstanding_messages_for_all_topics() + public void When_there_are_multiple_pages_of_outstanding_messages_for_all_topics() { var context = new RequestContext(); var messages = new List(); @@ -269,6 +269,56 @@ public async Task When_there_are_multiple_pages_of_outstanding_messages_for_all_ } } + [Fact] + public async Task When_an_outstanding_message_is_dispatched_async() + { + var context = new RequestContext(); + await _dynamoDbOutbox.AddAsync(_message, context); + + await Task.Delay(1000); + + var args = new Dictionary { { "Topic", "test_topic" } }; + + var messages = await _dynamoDbOutbox.OutstandingMessagesAsync(TimeSpan.Zero, context, 100, 1, args); + + //Other tests may leave messages, so make sure that we grab ours + var message = messages.Single(m => m.Id == _message.Id); + message.Should().NotBeNull(); + + await _dynamoDbOutbox.MarkDispatchedAsync(_message.Id, context); + + // Give the GSI a second to catch up + await Task.Delay(1000); + + messages = await _dynamoDbOutbox.OutstandingMessagesAsync(TimeSpan.Zero, context, 100, 1, args); + messages.All(m => m.Id != _message.Id); + } + + [Fact] + public async Task When_an_outstanding_message_is_dispatched() + { + var context = new RequestContext(); + _dynamoDbOutbox.Add(_message, context); + + await Task.Delay(1000); + + var args = new Dictionary { { "Topic", "test_topic" } }; + + var messages = _dynamoDbOutbox.OutstandingMessages(TimeSpan.Zero, context, 100, 1, args); + + //Other tests may leave messages, so make sure that we grab ours + var message = messages.Single(m => m.Id == _message.Id); + message.Should().NotBeNull(); + + _dynamoDbOutbox.MarkDispatched(_message.Id, context); + + // Give the GSI a second to catch up + await Task.Delay(1000); + + messages = _dynamoDbOutbox.OutstandingMessages(TimeSpan.Zero, context, 100, 1, args); + messages.All(m => m.Id != _message.Id); + } + private Message CreateMessage(string topic) { return new Message(