В бессерверной среде AWS решением по умолчанию для доступа к данным с очень малой задержкой обычно является DynamoDB.
Время отклика при чтении зависит от множества факторов, но для круглых чисел давайте вызовем его в диапазоне 10–20 миллисекунд (что я испытал), чтобы выполнить поиск по ключу из Lambda. Что не нравится.
В этой статье обсуждается подход к достижению производительности менее миллисекунды для наборов данных, которые все еще находятся в записях из нескольких 1000. Это открывает двери для большего количества вариантов использования, предлагает больший контроль над данными и доступом и, конечно же, высокую производительность.
TL;DR — Пример
- 7000+ ключей
- Общий размер файла Javascript 10 МБ (в слое Lambda)
- Настройки лямбда-памяти: 1536 МБ
- Производительность поиска: менее 1/10 миллисекунды
Окружающая среда
AWS Lambda,слои Lambda, Node.js 12.x
Пример использования
Определите объекты в сценарии чат-бота.
Объекты могут включать в себя: аэропорты, города, достопримечательности, почтовые индексы, ненормативную лексику, стоп-слова и т. д. Каждый набор данных содержит сотни или тысячи записей и более 10 МБ необработанных данных.
Для входящего (размеченного) пользовательского ввода выполните множество поисков, чтобы определить, является ли слово или последовательность слов допустимым объектом. Это задача с интенсивным поиском, поэтому типичные реализации кэша могут работать медленно. Мы собираемся сократить время выполнения такой задачи на несколько 100 мс.
Подготовка данных
Подготовить рельеф для создания лямбда-слоя. В вашей собственной файловой системе:
- Создайте и перейдите в каталог: nodejs
- инициализация npm -y
- Создайте и перейдите в каталог: node_modules
- Создайте и перейдите в каталог: cacheData (назовите как хотите)
- Создайте файл Javascript, назовем его: airportData.js
Пример файла airportData.js
module.exports = { airports: { "DEN": { "airportName": "Denver International Airport", "latitude": "39.86169815", "longitude": "-104.6729965, "countryCode": "US" }, "DFW": { "airportName": "Dallas Fort Worth Intl Airport", "latitude": "32.896801", "longitude": "-97.038002", "countryCode": "US" } } }
Создайте лямбда-слой
Заархивируйте вышеуказанный каталог nodejs, назовите zip-файл как хотите. Для наших целей возьмем layer1.zip.
- На панели инструментов AWS Lambda: Создать слой
- Введите имя слоя, например. слой1(как вам нравится)
- Загрузите файл (layer1.zip)
- Укажите время выполнения, например. узел.js 12.x
- Нажмите кнопку Создать.
Доступ к данным из Lambda
В вашей вызывающей функции…
// Lambda knows how to find this const airportData = require('cacheData/airportData'); // Reference the JS object containing the keys/data const airports = airportData.airports; let airport = airports['DFW']; // Keyed lookup console.log('DFW Airport: ' + JSON.stringify(airport, null, 2));
Увеличить кэш
Добавьте несколько файлов и/или каталогов в эту структуру каталогов nodejs/node_modules, чтобы увеличить количество кэшированных объектов данных, повторно заархивируйте и загрузите в уже созданный слой, создав новую версию.
СОВЕТ. Не забудьте указать вашей лямбда-функции эту вновь созданную версию для доступа к новым/обновленным файлам.
Утилита синхронизации
Чтобы проверить свою производительность (менее миллисекунды):
const startTimer = () => { return process.hrtime(); } const reportTimer = (start) => { const endTime = process.hrtime(start); const seconds = endTime[0]; // convert nanoseconds to milliseconds const ms = endTime[1] / 1000000; return `${seconds}s , ${ms}ms`; } const start1 = startTimer(); let airport = airports['DFW'] console.log(reportTimer(start1) + ' for DFW Airport: ' + JSON.stringify(airport, null, 2));
ПРИМЕЧАНИЯ
Размер объектов данных может повлиять на производительность холодного запуска, хотя и должен быть минимально инвазивным. Оставлю это для вас, чтобы проверить ваш сценарий.
В моем приложении есть 14 JS-объектов (файлов), разбросанных по 6 каталогам.
- Размер ZIP-файла: 5 МБ.
- Размер базовых данных: 30 МБ.
- Холодный пуск обычно ‹ 2 с.
- Производительность поиска: менее миллисекунды
Противовес
Если вы думаете, что я одержим скоростью, вот буханка хлеба, которую я недавно испекла. От начала до конца, время подготовки к завершению — около 16 часов. Некоторые вещи стоит ждать. Время отклика в интернете не то что хлеб!