2015-06-22 6 views
0

Я хочу отслеживать работу многоступенчатой ​​обработки.Модель данных Dynamodb для мониторинга процессов/транзакций

Скорее всего нужны следующие поля

batchId (guid) | eventId (guid) | statusId (int) | timestamp | message (string) 

Есть относительно небольшое число событий в партии.

Я хочу, чтобы иметь возможность легко запрашивать события, имеющие статусId меньше n (все еще обрабатывается или не завершается обработка).

Будет ли использовать несколько строк для каждого изменения статуса и наилучшим подходом к поиску последнего статуса? Я бы использовал глобальный вторичный индекс, но StatusId не кажется хорошим кандидатом на hashkey (менее 10 статусов).

ответ

1

Вместо использования нескольких строк для каждого изменения статуса, если вы обновили одну и ту же строку событий, вы можете использовать технику, описанную в разделе DynamoDB documentation в разделе «Использовать расчетное значение». В основном это связано с добавлением другого атрибута (скажем, 'outputStatusId'), который будет получен путем добавления случайного числа к statusId во время записи в DynamoDB. Например, для statusId из 2, nativeStatusId может быть одним из {"2-00", "2-01", .. "2-99"}. Настройка глобального вторичного индекса на производномStatusId даст вам некоторое преимущество, которое поможет предотвратить рост индекса.

Если вы уверены, что вы будете использовать этот индекс для только незавершенных событий, с последующим удалением атрибута derivedStatusId из записи, когда он переходит к готовому статусу будет удалить его из индекса, а также - что может быть хорошим свойство если события, как ожидается, закончат обработку в конце концов, и если они останутся навсегда. Этот метод называется «редким индексом» и более подробно описан here.

С вашего вопроса, похоже, сохранение записи истории состояния является желаемым свойством (я предполагаю это, потому что вы хотите иметь несколько строк для изменений состояния). Подумайте о том, чтобы положить эту историческую информацию в одну строку. DynamoDB поддерживает типы данных списка, а также имеет щедрый лимит в 400 Кбайт, который может позволить вам только захватить всю необходимую историческую информацию в той же записи.

+0

Глобальный вторичный индекс на производномStatusId: statusId + (eventId mod n) сделает его не горячим, но все равно придется выполнять n запросов, чтобы все элементы были корректными? – smashbourne

+0

Как будет выполняться сканирование на этом разреженном глобальном вторичном индексе? Поскольку я предполагаю, что сканирование будет работать для моего прецедента, так как не будет много незавершенных предметов в любой момент времени. – smashbourne

+1

Если вы удалите готовые элементы из индекса, как упомянуто выше, сканирование будет весьма эффективным, так как глобальный вторичный индекс будет содержать только незавершенные элементы. –