Как стать автором
Поиск
Написать публикацию
Обновить

Комментарии 13

Все эти сложности сделаны только для того, чтобы не пробрасывать явно конктекст обработки?
Не всегда возможно явно пробрасывать контекст обработки (например используется сторонняя функция/библиотека).
Если многоуровневые сервисы, то больно его руками передавать.
Все это для того, чтобы заменить Thread-local storage.
Лично меня чрезвычайно напрягает отсутствие каких-либо вменяемых зрелых стандартов по созданию trace ID

А OpenTracing чем не подошел?
Вот есть OpenTracing для Node.js
А вот Jaeger под ноду.

Я обеими руками за opentracing, но не очень вижу как оно решает проблему создания trace ID автоматом.

Возможно тупой вопрос. Для веба ведь есть Zone.js позволяющая «работать» с контекстом вызова, это нельзя прикрутить к ноде малой кровью?
Zone.js подменяет базовые асинхронные функции, такие как setTimeout. На ноде же их попросту слишком много.

А ещё Zone.js не умеет работать с функциями, объявленными как async, без транспиляции.

Все хорошо, конечно, но:


  1. как у этого решения с производительностью?
  2. Как-то не хочется в прод тащить экспериментальные модули (async_hooks), нет информации когда обещают перевести в статус стабильного?!
1. На бенчмарки можно тут посмотреть github.com/nodejs/benchmarking/issues/181 и решить для себя насколько оно критично. Как по мне иметь возможность адекватной трассировки важнее.
2. Зависит от того, что у вас за прод. Меня, как любителя смузи и всего модного-стильного-молодежного, это не смутило и поюзать уже успел, но и компания была вполне себе хипстерская, а не кровавый энтерпрайз.
спасибо за ссылку, гляну.
но там только async_hooks, я помню касательно Proxy то же не все гладко (было по крайней мере, может сейчас это пофиксили)
Просто я бы это добавил в статью — как минимум то, что это эксперементальный модуль…
Все, кто сюда дочитал, обратите внимание ещё на такую вещь.

И cls-hooked и вообще всё, что основано на async_hooks имеет одну существенную проблему.
Проблема НЕ в асинхронной части. Она большей степени покрыта. Проблема в том, что синхронный контекст можно разделить. Например:

issues/59
issues/249
Пример для Front-End

Исходя из этого наивное применение подобных пакетов чревато потерей контекста.

Посему все нормальные пакеты рекомендуют делать обёртки в тех местах, которые не могут быть покрыты асинхронным контекстом автоматически. Поэтому «биндить» только req и res — мало. Надо биндить ещё и кучу всего остального, например общение с БД. Посмотреть можно, например, тут, самый конец файла: Cloud Tracing Mongoose Sync Split Wrapper:

image

Недавно появился AsyncLocalStorage API, надеюсь он решит все проблемы

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации