Как сделать динамическое определение объема для отслеживания транзакций в NodeJ?
Я строю клиентский и серверный каркас (NodeJs), в котором я хочу отслеживать транзакции. У меня есть возможность передавать заголовки (Transaction_ID) между клиентом и сервером, однако я хочу иметь возможность установить транзакции ID автоматически. Это означает, что если заголовок определен, промежуточное программное обеспечение должно иметь возможность считывать и устанавливать идентификатор транзакции в контексте, чтобы нисходящие вызовы могли его прочитать.
Создание обертки выходит за рамки вопроса. То, с чем я борюсь, это возможность динамически создавать область и сохранять там значения.
ПРИМЕЧАНИЕ. - Я использую "строгий" режим, который запрещает динамическое определение области в узле. Так что нужен другой способ. ПРИМЕЧАНИЕ. - Я использую Promises для совершения звонков клиент-сервер.
2 ответа
Вот как я решил это наконец -
Я использовал CLS, который позволяет нам отслеживать динамический охват.
Чтение всего текста вокруг CLS заняло некоторое время, так что вот краткое изложение того, что я сделал (термины для неспециалистов)
ПРИМЕЧАНИЕ. - Я использую NodeJ с "строгим" режимом. Это означает, что я не могу использовать динамическую область видимости. Учитывая его производственную систему, я бы хотел придерживаться строгого режима. Отсюда альтернативный способ достижения динамического определения объема.
1) CLS создает динамический контекст / область. Это позволяет нам затем устанавливать / получать пары ключ-значение, которые видны только до тех пор, пока мы не окажемся в созданной области видимости.
2) Так как я использую Обещания Bluebird, CLS потребовал, чтобы я использовал патч, чтобы сохранить контекст / область действия доступными в Обещаниях. https://www.npmjs.com/package/cls-bluebird
3) Использование CLS с Promises заняло время, чтобы выяснить. Вот отличная дискуссия о том, как разные библиотеки использовали CLS для получения разных результатов. https://github.com/TimBeyer/cls-bluebird/issues/6
4) Вот как я использовал CLS (перефразированный и упрощенный) -
var cls = require('continuation-local-storage');
var clsbluebird = require('cls-bluebird');
var namespace = cls.createNamespace('ns');
clsbluebird( namespace );
var result;
namespace.run(function() {
namespace.set('key', 'value');
result = abc(); // returns 'value'
});
// versus doing –
result = abc(); // returns undefined
function abc() {
return namespace.get('key');
}
5) Usecase - таким образом я реализовал базовое отслеживание транзакций. Например. NewRelic, Trace и др.
Sequelize, одна из самых популярных orm делает это, используя продолжение локального хранилища модулей.
Надеюсь, это поможет вам