Мои первые шаги с Amazon DynamoDB

Недавно я работал над личным проектом, в котором решил использовать и узнать больше о DynamoDB. Хотя в прошлом я немного использовал Dynamo для мелких задач, большая часть моего прошлого опыта была связана с реляционными базами данных, и мне потребовалось некоторое время, чтобы разобраться в работе с NoSQL.

Что такое DynamoDB?

DynamoDB — это полностью управляемая база данных NoSQL Amazon Web Services.

В отличие от реляционных баз данных, в которых данные хранятся в виде структурированных строк и столбцов, данные Dynamo хранятся в виде пар ключ-значение. Это означает, что данные, которые вы храните в Dynamo, неструктурированы по сравнению с тем, что вы обычно видите в реляционной базе данных. Единственная схема, которую вам нужно определить, — это ключи вашей таблицы: ключ секции и ключ сортировки. Кроме того, ваши данные могут быть бессхемными (хотя ваше приложение все равно должно знать, как с ними обращаться).

Виноват

В моем проекте я использую Python и обращаюсь к Dynamo через библиотеку boto3. Это работает на AWS Lambda. В моем коде у меня есть модель данных collection , с которой мне нужно было выполнять основные операции CRUD (создание, чтение, обновление, удаление).

Мой код выглядел примерно так:

Ты видишь мою ошибку?

При каждой операции с базой данных я повторно инициализировал ресурс boto3 и таблицу Dynamo.

Это было легко сделать (особенно с GitHub Copilot, в основном пишущим эти функции за меня), и в то время я особо об этом не думал. Однако, просматривая код, мой жених, Майлс Лоффлер, указал мне, что это фактически антипаттерн при работе с boto3 клиентами, особенно на Lambda.

Примечание. Хотя я столкнулся с этим анти-шаблоном во время работы с Dynamo, из-за характера операций CRUD вы можете столкнуться с ним в любое время, когда повторно инициализируете один и тот же ресурс boto3 снова и снова. !

Как я это исправил

К счастью, это было легко исправить, и исправление сделало мой код в целом лучше!

Я создал новый файл utilities для обработки подключений к базе данных и добавил следующие функции:

Затем я реорганизовал свои функции CRUD, чтобы использовать только get_dynamo_table вместо прямого использования boto3.

Возможно, вы заметили использование глобальных переменных в моей утилите базы данных. Хотя это часто считается плохой практикой, я использовал их, основываясь на передовой практике Lambda, которая предлагает использовать преимущества повторного использования среды выполнения.

Какая разница?

Это сделало четыре основных отличия от моего кода:

Производительность

Это, очевидно, большой!

Для тестирования я развернул две версии приложения, одну со старым кодом и одну с новым, и прогнал некоторые рабочие процессы, которые привели к операциям CRUD.

Вот несколько примеров трассировки моего приложения без применения к нему этого изменения. Это действие включало удаление элемента и запроса:

А вот и следы тех же двух действий (удалить и запросить) через приложение с применением этого изменения:

Хотя мы говорим только о долях секунды, эти задержки со временем складываются! Приложение работает заметно быстрее и быстрее реагирует после применения этого изменения.

Чистота

Этот подход легче читать, и в долгосрочной перспективе в моем проекте определенно будет меньше кода. Мне не нужно импортировать boto3и обращаться к переменным среды всякий раз, когда мне нужно получить доступ к базе данных. Теперь для доступа к Dynamo существует единственная функция, поэтому, если мне нужно что-то изменить, мне нужно будет изменить это только в одном месте.

Тестируемость

Тесты тоже чище. Раньше мне приходилось имитировать boto3 в каждом месте, что также было довольно сложно, поскольку я имитировал возвращаемое значение возвращаемого значения. Теперь я могу просто издеваться над get_dynamo_table , что намного проще и читабельнее.

Возможность повторного использования

Новые функции в utils.db вообще не заботятся об имени таблицы — оно извлекается функцией get_dynamo_table_name в настройках. По мере роста моего проекта этот код можно повторно использовать в других Lambdas, которые могут использовать разные таблицы Dynamo.

Как я уже упоминал выше, я новичок в использовании DynamoDB от Amazon — и я все еще учусь!