Как сделать динамическое определение объема для отслеживания транзакций в 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 делает это, используя продолжение локального хранилища модулей.

Надеюсь, это поможет вам

Другие вопросы по тегам