SQL LIMIT OFFSET как запрос на DynamoDB с использованием Lambda, boto3 - PullRequest
0 голосов
/ 23 мая 2019

Я новичок в разработке бэкэндов и в AWS, и я практикую создание API-интерфейсов API с использованием AWS Lambda и DynamoDB. По сути, клиенты должны иметь возможность отправлять http запросы от Lambda до API Gateway, тогда Lambda получит / вставит записи из / в DynamoDB.

Итак, часть, которую я застрял, - это нумерация страниц. Представьте себе веб-приложение, такое как StackOverflow, куда люди могут заходить и задавать вопросы. Это веб-приложение имеет таблицу базы данных Questions в бэкэнде и выглядит так:

  • QuestionId (String): случайный хеш, ключ раздела
  • Tag (String): для простоты предположим, что у каждого вопроса может быть только один тег
  • Название (String)
  • Content (String)
  • CreatedAt (Number): ключ сортировки, время создания в миллисекундах с начала эпохи.

Теперь мне нужна поддержка GET с нумерацией страниц. API должен быть в состоянии обработать запрос GET в этой форме:

GET http://www.example.com/questions?tag=trees&page=21&pagesize=15

Это должно вернуть список вопросов о деревьях на 21-й странице, где каждая страница содержит не более 15 записей.

Так же, как нумерация страниц StackOverflow:

https://stackoverflow.com/questions/tagged/amazon-web-services?sort=newest&page=21&pagesize=15

Если бы это была таблица SQL, я бы сделал что-то вроде этого:

SELECT * FROM Questions WHERE Tag=trees ORDER BY CreatedAt LIMIT 15 OFFSET (15*20)


Из этого урока, документации и т. Д. Я узнал, что DynamoDB не совсем так работает. Похоже, что если запрос запрашивает, скажем, 5000-ю страницу, Lambda необходимо извлечь все 5000 страниц из БД и только отбросить первые 4999 страниц и вернуть последнюю.

Кроме того, существует определенный предел, 1 МБ, в размере данных, возвращаемых из дБ. Это означает, что если я не могу найти 5000-ую страницу в первом ответе БД, я должен запросить следующую партию. Это кажется слишком сложным для такой общей черты, и я чувствовал, что должен быть лучший подход.

Я заинтересован в изучении общих стратегий, которые используются на реальном рынке для вышеуказанных проблем. Например, StackOverflow буквально не тратит время на получение 100000-й страницы с тегом Java. Мало того, что он даже знает номер последней страницы для каждого тега. Может ли кто-нибудь предоставить подходящий пример лямбда-кода, который может обрабатывать такие запросы?

...