Мои первые шаги с 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 — и я все еще учусь!