Фрагмент кода для периодического получения ключа доступа в Nodejs - PullRequest
2 голосов
/ 01 августа 2020

Мой nodejs (12.18) проект должен получить ключ доступа с удаленного сервера и передать его пользователям, которые его запрашивают. Ключ доступа будет обновляться каждые 5 минут. a setInterval используется для получения ключа доступа каждые 5 минут с удаленного сервера, а ключ доступа хранится в global.variable для доступа на позднее чтение.

const helper = require("../lib/helper");
global._cloudStorageAccessInfoObject = {};  //<<==declare global variable
var bucket_name, roleSessionName, policy, accessObj;
policy = JSON.stringify({
    //my policy
});

bucket_name = "xxx-cloud-1";
roleSessionName = 'myapp';

setInterval(async () => {
   
    accessObj = await helper.getOSSstsToken(bucket_name, roleSessionName, policy);
    if (accessObj && accessObj !== {} && accessObj.accessKeyId) {
        _cloudStorageAccessInfoObject = accessObj;  //<<==access key assigned to global variable
    }
}, 1000*60*5);  //<<==retrieve access key once every 5 minutes

Приведенный выше код пока работает нормально. По этому поводу есть 2 вопроса:

  1. setInterval с точки зрения производительности хорошо для использования в продакшене (много пользователей)?
  2. Есть сообщение , о котором говорится bad global variable. Есть ли другое лучшее альтернативное решение для хранения ключа доступа для позднего использования в приложении. В настоящее время приведенный выше код является единственным кодом, обновляющим глобальные данные для доступа на чтение в конце приложения.

Ответы [ 2 ]

1 голос
/ 01 августа 2020

В вашем случае я рекомендую использовать задание cron.

Преимущества решения cron

  • меньшее потребление памяти в 90% случаев
  • утечки памяти эффективно устраняются
  • код перезагружает все библиотеки каждый раз, поэтому обновления вступают в силу при следующем запуске без дополнительных сложностей

Преимущества решения демона

  • время загрузки происходит только один раз, поэтому дисковый ввод-вывод и ЦП будут ниже для последующих запусков, поскольку вы не будете анализировать исходный код или загружать все библиотеки
  • нижний ЦП и дисковый ввод-вывод для последующих запусков также означает, что есть больше этих ресурсов, доступных для любого вашего основного приложения для Raspberry.
  • Linux должен заменить память, которую вы не используете. Это может быть очень медленным в зависимости от вашего хранилища.

https://serverfault.com/questions/853930/cron-job-vs-nodejs-setinterval-for-optimal-performance/854096#854096

И вместо того, чтобы устанавливать переменную в глобальную переменную, вы можете сохранить ее в выделенную таблицу в базе данных.

Таким образом, ваше задание cron сохраняет ваш ключ в таблице, а ваш api загрузит ключ из базы данных.

1 голос
/ 01 августа 2020

Вы можете использовать cron-job вместо setInterval. Вот ссылка на node-cron https://www.npmjs.com/package/node-cron.

Вместо использования глобальной переменной вы можете использовать локальное хранилище и обновить его. Вы можете получить доступ к данным из него в любом месте вашего приложения.

...