В бессерверной среде 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 часов. Некоторые вещи стоит ждать. Время отклика в интернете не то что хлеб!