Comments 11
В модуле fs появились новые функции: fs.readSync, fs.readv, fs.readvSync.
fs.readSync
был чуть ли не в первой ревизии ноды. Сейчас просто запилили версию функции с другой сигнатурой.
Много интересного можно найти в новом API для отслеживания ресурсов в асинхронном программировании: async_hooks
Нативные расширения могут контекст подпортить (да и не нативные тоже), поэтому нужно весьма аккуратно использовать async_hooks
. В частности у нас с node-redis
проблемы были.
Концептуальные проблемы async_hooks
обсуждаются тут — https://github.com/nodejs/diagnostics/issues/300
Конкретно, что у нас встречалось — https://github.com/nodejs/node/issues/16098
Вообще CLS крутая штука, удобно автоматически пробрасывать контекст (а-ля tracking id / user). Но нужно быть весьма внимательным, да, чтоб не напороться на проблемы.
Производительность async_hooks уже починили? А то только его подключение просаживает скорость работы с промисами процентов на 30. Неудивительно, там же на каждый резолв вызывается куча дополнительного JS-кода из интерналс (по крайней мере, так было полгода назад).
А отслеживание цепочки вызовов нативно тоже пока не сделали? Просто какая штука, чтобы сделать поддержку локального контекста, полгода назад приходилось на JS держать глобальный Map с parent_context_id=>context_id и на каждый чих туда писать данные (а это две записи на каждый резолв промиса, даже моментальный). Проще всего понять, как это работает, на примере модуля contexty из npmjs (он самый минималистичный). На это тратилась уйма CPU (в дополнение к тому, что там уже и так тратится при подключении async_hooks), и вот если бы этот Map просто сделали нативной поддержкой в C++, это бы сильно все улучшило. Полгода назад ничего такого еще не было сделано, и я не знаю, планировалось/планируется ли.
AsyncLocalStorage это не нативно. Это класс на JS, который исполюзует другой класс на JS AsyncResource, который использует async_hooks, который тоже на JS.
Вот что выполняется на каждом резолве промисов (и других асинхронных операциях типа nextTick, IO и т.д.): https://github.com/nodejs/node/blob/master/lib/internal/async_hooks.js
Кстати, насколько я понимаю, все это содержимое lib/internals (а может быть даже и вся lib) бандлится внутрь бинарника node и парсится/запускается при каждом старте node. Такой ”рантайм на JS” своеобразный (они стараются на C++ как можно меньше писать такого утилитарного кода, но в случае с async_hooks от этого больше беды чем пользы).
Встречайте Node.js 14.0.0