Я создаю клиентскую и серверную структуру (NodeJs), в которой я хочу отслеживать транзакции. У меня есть возможность передавать заголовки (transaction_id) между клиентом и сервером, однако я хочу иметь возможность автоматически устанавливать транзакцию. Это означает, что если заголовок определен, промежуточное программное обеспечение должно быть в состоянии читать и устанавливать идентификатор транзакции в контексте, чтобы вызовы по потоку могли читать его.
Обертки здания выходят за рамки вопроса. То, с чем я борюсь, - это возможность динамически создавать область и хранить там ценности.
ПРИМЕЧАНИЕ. Я использую "строгий" режим, который запрещает динамическое масштабирование в узле. Так нужен другой путь. ПРИМЕЧАНИЕ. Я использую Promises для вызова клиент-сервер.
Вот как я решил это окончательно -
Я использовал CLS, который позволяет нам отслеживать динамический охват.
Чтение всего текста вокруг CLS заняло некоторое время, поэтому вот краткое изложение того, что я сделал (условия неспециалиста)
ПРИМЕЧАНИЕ. Я использую NodeJs со строгим режимом. Это означает, что я не могу использовать динамическое масштабирование. Учитывая его производственную систему, я бы хотел сохранить строгий режим. Следовательно, альтернативный способ достижения динамического охвата.
1) CLS создает динамический контекст/область. Это позволяет нам установить/получить пары ключ-значение, которые видны только до тех пор, пока мы не будем в пределах созданной области.
2) Поскольку я использую обещания Bluebird, CLS потребовал от меня использовать патч, чтобы поддерживать контекст/область в рамках Promises. https://www.npmjs.com/package/cls-bluebird
3) Использование CLS с обещаниями потребовалось время для выяснения. Вот отличная дискуссия о том, как разные библиотеки использовали 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 делает это, используя локальное хранилище продолжения модуля
Надеюсь, что это поможет вам