Как сделать динамическое определение объема для отслеживания транзакций в NodeJ?

1

Я создаю клиентскую и серверную структуру (NodeJs), в которой я хочу отслеживать транзакции. У меня есть возможность передавать заголовки (transaction_id) между клиентом и сервером, однако я хочу иметь возможность автоматически устанавливать транзакцию. Это означает, что если заголовок определен, промежуточное программное обеспечение должно быть в состоянии читать и устанавливать идентификатор транзакции в контексте, чтобы вызовы по потоку могли читать его.

Обертки здания выходят за рамки вопроса. То, с чем я борюсь, - это возможность динамически создавать область и хранить там ценности.

ПРИМЕЧАНИЕ. Я использую "строгий" режим, который запрещает динамическое масштабирование в узле. Так нужен другой путь. ПРИМЕЧАНИЕ. Я использую Promises для вызова клиент-сервер.

Теги:
strict
dynamic-scope

2 ответа

3
Лучший ответ

Вот как я решил это окончательно -

Я использовал 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 и т.д.

1

Sequelize, один из самых популярных orm делает это, используя локальное хранилище продолжения модуля

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

  • 0
    Спасибо Шивам. Это именно то, что мне было нужно.
  • 0
    Здорово, что это помогло. Можете ли вы пометить это, спросить, что ответили? Так что, если кто-то наткнется, у них будет направление

Ещё вопросы

Сообщество Overcoder
Наверх
Меню