Сохраняет ли лямбда какие-либо данные в памяти? - PullRequest
3 голосов
/ 03 августа 2020

У меня есть код ниже в AWS лямбда:


const cache = {};

exports.handler = async (event) => {
    // TODO implement
    if (cache[event.key]) {
        console.log('read from cache');
        return cache[event.key];
    }
    console.log('generate value');
    cache[event.key] = Math.random()
    
    return cache[event.key];
};

, когда я запускаю лямбда, и я вижу read from cache в журнале, что означает, что лямбда-кеш имеет некоторые значения в кеш-памяти. Сохраняет ли лямбда память, когда становится теплее? Означает ли это, что я могу использовать эту память для некоторого кеширования, чтобы повысить производительность?

Ответы [ 2 ]

4 голосов
/ 03 августа 2020

Можно сохранить что-то между вызовами Lambda (при условии, что вызовы попадают в одну и ту же MicroVM), но ваше приложение не должно полагаться на него для производительности.

Нет гарантии, как долго это будет сохраняются на MicroVM, также помните о томе, который вы храните в памяти, так как это может повлиять на производительность вашей Lambda, если для нее недостаточно памяти. Если вы хотите повысить производительность, обратите внимание на некоторые из этих параметров:

  • Хранилище параметров системного менеджера - используйте этот вариант, если вам нужно сохранить один ключ / комбинация значений.
  • DynamoDB - используйте эту опцию, если вам нужно несколько комбинаций ключ / значение.
  • Elasticache - используйте эту опцию, если вы требуется хранилище ключей / значений в памяти с поддержкой многих сложных типов данных. Это потребует добавления лямбды к VP C.
2 голосов
/ 03 августа 2020

Лямбда-контейнер остается живым даже после завершения вызова. Таким образом, любые данные, загруженные в память контейнера, будут доступны на протяжении всего жизненного цикла контейнера Lambda.

Таким образом, эта память может использоваться как рычаг для кэширования. 1006 * будет полезно, если ваше приложение требует много чтения. Например, в случае, когда одно и то же имя пользователя должно быть получено из базы данных, мы можем кэшировать имя пользователя для будущих вызовов. Таким образом, снижается стоимость запроса к БД.

Вышеупомянутый подход кажется полезным, но есть и несколько недостатков:

  1. Отсутствие синхронизации между различными лямбда-контейнерами, созданными множественными вызовами лямбда приведет к сохранению тех же данных и множеству пропусков уже сохраненных данных в кеше.
  2. Если данные в кеше увеличились до уровня нехватки памяти, необходимого для обработки лямбда, это может привести к остановке лямбда все работает.
...