Популярная викторина: допустим, мы хотим быстро настроить микросервис, который постоянно хранит данные, не требует никаких затрат для работы в режиме ожидания, но готов к масштабированию при необходимости. Какой стек технологий лучше всего подходит для этого?
Одним из вариантов решения проблем со стороны сервисов может стать хорошо известная бессерверная структура на AWS Lambda. Но в этой статье я покажу вам новый способ обработки хранилища данных: вместо создания выделенного экземпляра базы данных мы будем использовать Unbounded.

Unbounded - это база данных как услуга, которая разными способами использует подход, отличный от того, к которому вы, возможно, привыкли в хранилищах данных NoSQL. Поскольку эта статья является первой в серии, мы сосредоточимся только на нескольких свойствах Unbounded, которые позволяют нам легко настроить и запустить наш сервис.
Для начала установим Serverless и создадим новый проект:
$ npm install -g serverless ... $ serverless Serverless: No project detected. Do you want to create a new one?
Ответьте «Y», чтобы создать новый проект, и выберите тип проекта «AWS Node.js». В качестве имени службы я выбрал «фильмы», поскольку мы собираемся создать базу данных фильмов (да, я знаю, уже существует несколько хорошо известных баз данных фильмов, но потерпите меня).
Теперь давайте перейдем в каталог нашего проекта и установим «экспресс-пакет» и некоторое промежуточное ПО, чтобы упростить разработку нашего сервиса:
$ cd movies $ ls handler.js serverless.yml $ npm init ... $ npm install --save express serverless-http body-parser
Поскольку мы используем экспресс, нам нужно отредактировать файл serverless.yml, чтобы направить все запросы в нашу функцию индексации. Вот пример файла, который вы можете скопировать:
Затем мы заменим содержимое файла handler.js следующим:
Все идет нормально; Предполагая, что у нас настроены учетные данные AWS, выполнение команды «бессерверное развертывание» предоставит нам микросервис с одной конечной точкой для вывода списка наших фильмов. В настоящее время эта конечная точка возвращает пустой массив JSON, поскольку у нас еще нет данных.
Чтобы исправить это, мы установим клиентскую библиотеку Unbounded. Unbounded возвращает данные с использованием обещаний, поэтому я также собираюсь установить пакет awaitjs, чтобы мы могли легко использовать async / await с экспрессом (Unbounded также поддерживает обратные вызовы, но эй, это 2020 год, давайте жить на грани):
$ npm install --save @unbounded/unbounded @awaitjs/express
Теперь давайте обновим наш сервисный код:
Это должно (мы надеемся) быть довольно простым, если вы знакомы с Node и выражаете. Мы создаем неограниченное соединение, указав имя региона («aws-us-east-2»), адрес электронной почты и пароль (см. *** примечание ниже). Мы добавили два новых экспресс-обработчика для создания и извлечения одного объекта и обновили обработчик «GET / movies», чтобы получить все фильмы из базы данных. Чтобы реализовать это, мы использовали вызовы «вставить», «сопоставить» и «запрос» в экземпляре клиента Unbounded. Поскольку неограниченные записи представляют собой простые объекты JSON, мы можем отправлять результаты наших вызовов «сопоставление / запрос» напрямую для выражения.
Но теперь приходит поворот: что еще нам нужно сделать, чтобы настроить внутреннее хранилище данных до того, как мы закончим?
Ничего такого.
Если мы заменим приведенные в качестве примера адрес электронной почты и пароль на собственный адрес электронной почты и выдуманный пароль, а затем повторно развернем нашу службу, она будет немедленно готова к тестированию:
$ curl -X POST https://xxxxxxxxx.execute-api.us-east-2.amazonaws.com/dev/movies -d 'name=Back to the Future&year=1985' {"id":"P0ePhfWRdZu4UNZV20Mw"} $ curl https://xxxxxxxxx.execute-api.us-east-2.amazonaws.com/dev/movies/P0ePhfWRdZu4UNZV20Mw {"name":"Back to the Future","year":1985,"reviews":[],"id":"P0ePhfWRdZu4UNZV20Mw"}
Это возможно, потому что мы используем некоторые свойства Unbounded, которые помогут вам быстро начать работу:
- При вставке данных, если пользователь не существует с указанным адресом электронной почты, Unbounded создаст нового пользователя (если вы хотите сохранить свои данные навсегда, вам придется в конечном итоге убедиться, что ваш адрес электронной почты настоящий, войдя в систему на Админка сайта).
- При вставке данных в несуществующую базу данных Unbounded автоматически создает базу данных.
- По умолчанию базы данных создаются с одним полем первичного ключа с именем «id».
- При вставке объектов любые неопределенные значения первичного ключа создаются как случайные строки.
- Схема нам не нужна, потому что по умолчанию, поскольку Unbounded не накладывает ограничений на то, какие данные могут быть вставлены. Свойства могут содержать встроенные объекты или массивы, а также простые значения JSON (мы будем использовать это позже при заполнении нашего свойства «reviews»).
Конечно, в реальном сценарии мы не ограничены этой базовой конфигурацией для использования Unbounded и не ограничены простыми запросами типа "ключ-значение" для извлечения наших объектов. Но мы начнем рассматривать эти и многие другие функции в следующей статье.
А пока мы приглашаем вас начать экспериментировать с Unbounded самостоятельно. Посетите наш основной портал документации или клиентский модуль Javascript для получения технической информации и не стесняйтесь присылать нам отзывы на [email protected] или в Twitter, поскольку мы продолжаем совершенствовать и расширять наши API.
Развлекайся!
— W.W.
(и ознакомьтесь со второй частью статьи здесь)
*** Примечание о паролях: мы помещаем пароль непосредственно в исходный код только в качестве примера. Это плохая практика, потому что размещение этого источника в общедоступном репозитории приведет к утечке конфиденциальной информации. Если вы планируете развернуть реальный сервис, используйте механизмы хранения секретов, встроенные в Serverless.