2017-02-02 4 views
1

Я использую Azure Functions с Node.Js.Azure Функции - общие объекты между различными вызовами

Я создал пользовательский модуль журнала Node.js, который использует объект контекста azure и записывает в журнал функции, который отображается в интерфейсе портала Azure. Поскольку мы используем его в нескольких местах, мы определили его как одноэлементный объект, и мы применили к нему объект контекста функции.

Затем мы выяснили, что все остальные функции выполнялись с использованием одного и того же объекта журнала ... и не регистрировали данные в своем собственном журнале контекста. Это очень странно для нас, так как мы ожидали, что каждый вызов функции изолирован, и между разными вызовами нет разделяемых модулей.

Это лазурное код функции:

var Logger = require('../custom_modules/logger/customLogger.js'); 

module.exports = function (azureContext) { 
    function infoFn(msg){ 
     azureContext ? azureContext.log(msg) : console.log(msg); 
    } 
    function errorFn(msg){ 
     azureContext ? azureContext.log(msg) : console.error(msg); 
    } 

    var logger = Logger(infoFn, errorFn); 

    logger.info('function was triggered'); 
    azureContext.done(); 

    } 

И это регистратор код модуля:

var _customLogger; 

var CustomLogger = function (info, error) { 
    this.error = error; 
    this.info = info; 
}; 

function logger(info, error) { 
    if (!_customLogger) { 
     _customLogger = new CustomLogger(info, error); 
    } else { 
     if(info){ 
      _customLogger.info = info; 
     } 
     if(error){ 
      _customLogger.error = error; 
     } 
    } 
    return _customLogger; 
} 

module.exports = logger; 

ли это предположить, чтобы быть, как это? Мы ожидали, что каждый вызов функции будет изолирован.

ответ

2

Экземпляр регистратора, переданный в вашу функцию, действительно отличается для каждой функции и каждого вызова функции. Мы создаем новый экземпляр для каждого вызова.

Я считаю, что любые проблемы, которые вы видите с несколькими вызовами, мешающими регистрации других, связаны с вашим пользовательским компонентом регистрации. Проблема заключается в том, что ваш общий пользовательский однопользовательский логгер захватывает (и разделяет) специальный Azure-регистратор вызовов через вызовы. Это верно, потому что вы возвращаете singleton к различным вызовам, и все эти вызовы мутируют его.

Независимо от того, в чем ваша цель состоит в том, чтобы обернуть нашу инфраструктуру регистрации, вы должны удалить это поведение singleton для восстановления изоляции. Недавно мы также внесли изменения в наш регистратор, чтобы разоблачить методы для разных уровней журналов. log,, error, warn. Скоро это произойдет.

+0

Спасибо за ваш ответ. Я думал, что изоляция процесса по умолчанию используется, когда я использую функции Azure (это идея архитектуры серверной архитектуры, насколько я ее понимаю). Из того, что вы написали, я понимаю, что я не могу использовать регистратор как одноэлементный объект, и я его изменю. Благодарю. –

+0

Да, это действительно отстой. Еще одна причина, по которой они должны просто поддерживать console.log вместо того, чтобы заставлять нас проходить контекст. –

Смежные вопросы