Как получить максимальное значение ключа диапазона в DynamoDB, когда ключ диапазона - это номер версии?

Я создал одну службу X, где учетные запросы с некоторыми данными поступают от многих других служб Y. Я создаю один idempotent_id из этих данных, добавляя множество атрибутов, чтобы этот idempotent_id оставался уникальным. Я также создаю одну idempotent_version и устанавливаю для нее значение 1. Я сохраняю эту запись в DynamoDB (используя idempotent_id и idempotent_version как ключ раздела и ключ сортировки). теперь я вызываю другую службу Z с этими idempotent_id и idempotent_version. Через некоторое время, предположим, что приходит запрос с теми же данными, я создаю idempotent_id, но он будет таким же, как и раньше, поскольку мы обрабатываем ту же запись. теперь мне нужно создать idempotent_version, которое в этом случае будет равно 2, потому что такой же запрос поступил раньше (это может быть n, если запрос n-1 уже пришел). как я могу узнать, какой будет idempotent_version для текущей записи данных, потому что я буду хранить данные в DynamoDB с этой версией, а также вызывать службу Z с этой версией. (для текущего сценария будет 2)


person Akash Patel    schedule 17.06.2020    source источник
comment
Я не хочу сканировать записи. пожалуйста, предложите какое-нибудь эффективное решение.   -  person Akash Patel    schedule 17.06.2020


Ответы (1)


В документах есть раздел Использование ключей сортировки для контроля версий.

В основном, когда вы создаете v1, также создавайте как копию v1 как v0. Версия 0 всегда будет самой последней. Один дополнительный атрибут v0 называется «Самый последний» и будет начинаться с 1.

Итак, когда пришло время v2 ...

GetItem(hash:v0)
PutItem(hash:v2)
Copy v2 to v0, update "Latest" to 2
UpdateItem(hash:v0)

Благодаря новой поддержке транзакций вы можете гарантировать, что Put v2 и обновление v0 согласованы.

person Charles    schedule 17.06.2020
comment
спасибо, это полезно. актуальная проблема в том, что я создаю таблицу DynamoDB. Я использую idempotentId в качестве ключа раздела и versionNumber в качестве ключа сортировки. предположим, что существует 1000 версий для любого конкретного idempotentId. для моего варианта использования я всегда хочу узнать последнюю версию любого idempotentId. Будет ли какая-либо разница в производительности, когда мне нужен первый номер версии и когда мне нужен последний номер версии или оба они займут одно и то же время. - person Akash Patel; 18.06.2020
comment
Самая последняя версия, скажем, v1000, также v0. Получение v0 или v1 займет столько же времени. - person Charles; 18.06.2020
comment
хорошо, у меня есть решение. просто для моей информации, если я хочу получить доступ к любой случайной версии, скажем, 500 или 600. займет ли это столько же времени? у меня вопрос: доступ к другой версии займет разное время или время доступа будет одинаковым для всех версий? - person Akash Patel; 18.06.2020
comment
DDB предназначен для обеспечения времени отклика в миллисекундах для любой данной отдельной записи с помощью GetItem (). - person Charles; 18.06.2020
comment
если я скажу, что не знаю номер версии. например, если задан idempotentId, узнать idempotentVersion, когда некоторым атрибутом в записи является x. я предполагаю, что сканирование будет происходить в этом случае? - person Akash Patel; 21.06.2020