Forwarded from Node.JS [ru] | Серверный JavaScript
process.nextTick: невидимый убийца event loop, который кладет production-сервисы
Кажется, что все знают про process.nextTick, но на практике я регулярно вижу, как он валит продакшен. Проблема в том, что он имеет высший приоритет в микротаск-очереди и выполняется до любого I/O и таймеров. Это делает его опасным при рекурсивном использовании.
Как рекурсивный nextTick убивает таймеры
Event loop после каждого макротаска вычищает все микротаски. process.nextTick — микротаск с наивысшим приоритетом. Рекурсия без выхода блокирует очередь:
После первого макротаска event loop заходит в микротаски. Там recursiveTick добавляет новый nextTick. И так бесконечно. setTimeout и setInterval не запускаются — они в макротасках, а микротаски не кончаются.
Production-кейс с кэшем и БД
У нас система с кэшем при ошибке доступа к БД в nextTick крутила переинициализацию соединения. В ошибочном сценарии — рекурсия. Результат: health-check’и молчали (таймеры не работали), входящие запросы висели, сервис падал веером. Типичная ошибка — думать, что nextTick безопасен для retry-логики.
Практические решения
* Никогда не используйте рекурсивный nextTick. Вместо него setImmediate — он ставит задачу в следующую фазу event loop, давая I/O и таймерам шанс:
* Если очередь нужна, добавьте лимит итераций. После, скажем, 1000 вызовов — принудительный yield через setTimeout(fn, 0).
* Для длинных цепочек используйте библиотеки для backpressure, иначе даже без бесконечной рекурсии производительность упадет.
Вывод:
process.nextTick ломает кооперативную природу event loop, и даже короткая рекурсия может полностью парализовать I/O и таймеры в production.
Кажется, что все знают про process.nextTick, но на практике я регулярно вижу, как он валит продакшен. Проблема в том, что он имеет высший приоритет в микротаск-очереди и выполняется до любого I/O и таймеров. Это делает его опасным при рекурсивном использовании.
Как рекурсивный nextTick убивает таймеры
Event loop после каждого макротаска вычищает все микротаски. process.nextTick — микротаск с наивысшим приоритетом. Рекурсия без выхода блокирует очередь:
function recursiveTick() {
process.nextTick(recursiveTick);
}
recursiveTick();После первого макротаска event loop заходит в микротаски. Там recursiveTick добавляет новый nextTick. И так бесконечно. setTimeout и setInterval не запускаются — они в макротасках, а микротаски не кончаются.
Production-кейс с кэшем и БД
У нас система с кэшем при ошибке доступа к БД в nextTick крутила переинициализацию соединения. В ошибочном сценарии — рекурсия. Результат: health-check’и молчали (таймеры не работали), входящие запросы висели, сервис падал веером. Типичная ошибка — думать, что nextTick безопасен для retry-логики.
Практические решения
* Никогда не используйте рекурсивный nextTick. Вместо него setImmediate — он ставит задачу в следующую фазу event loop, давая I/O и таймерам шанс:
function safeRecursive() {
// логика
setImmediate(safeRecursive);
}* Если очередь нужна, добавьте лимит итераций. После, скажем, 1000 вызовов — принудительный yield через setTimeout(fn, 0).
* Для длинных цепочек используйте библиотеки для backpressure, иначе даже без бесконечной рекурсии производительность упадет.
Вывод:
process.nextTick ломает кооперативную природу event loop, и даже короткая рекурсия может полностью парализовать I/O и таймеры в production.
Forwarded from Dezzigners
This media is not supported in your browser
VIEW IN TELEGRAM
🧰 Tooltip Creator — поможет быстро добавить комментарии и подсказки поверх готовых экранов
Dezzigners
Dezzigners
Forwarded from PSD | Дизайн-пространство
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from ai.dot(ufna, dev)
Правильное решение проблем в фентезийном мире.
Бтв, обожаю этот канал нейромультов, там прям клёво автор по стилю стал делать, и сюжетка огонь.
Бтв, обожаю этот канал нейромультов, там прям клёво автор по стилю стал делать, и сюжетка огонь.
Forwarded from PSD | Дизайн-пространство
Media is too big
VIEW IN TELEGRAM
Forwarded from PSD | Дизайн-пространство
До конца 2026 года дизайнеров интерфейсов станет намного меньше
Статья рассказывает о том, как автор перестал получать запросы на разработку интерфейсов за последний год. Он делится своими мыслями и наблюдениями по этому поводу
Читать на дизайнерс | #статья
Статья рассказывает о том, как автор перестал получать запросы на разработку интерфейсов за последний год. Он делится своими мыслями и наблюдениями по этому поводу
Читать на дизайнерс | #статья
Forwarded from Daily Coding 🔥
🛠 Study - это инструмент для тестирования AB, разработанный таким образом, чтобы быть понятным, минималистичным и гибким. Библиотека работает как в браузерных, так и в серверных средах, поддерживает несколько драйверов хранилища и имеет понятный, хорошо документированный API.
🌍 Сайт
Daily Coding #инструменты #тестирование & Max
🌍 Сайт
Daily Coding #инструменты #тестирование & Max
Forwarded from PSD | Дизайн-пространство
This media is not supported in your browser
VIEW IN TELEGRAM
M6 - crypto venture capal fund
Forwarded from Node.JS [ru] | Серверный JavaScript
SharedArrayBuffer без Atomics: гонка, которую не видно
Когда два worker_thread пишут в один SharedArrayBuffer, состояние памяти может разрушиться без видимых исключений. Особенно это заметно на ARM: вместо ожидаемых 0xFF00FF00 и 0x00FF00FF получается 0x0000FFFF — байты частично обновляются и перемешиваются. Частая ошибка — думать, что «просто запись» в SharedArrayBuffer безопасна без Atomics.
Почему это ломается
Два воркера одновременно пишут в соседние ячейки Uint32Array. Кэш-линии процессора конфликтуют, и результат — частичное обновление. В production это проявляется как расходящиеся данные или краши без явной причины. Диагностика сложна: console.log с двоичным выводом может показать мусор, но только постфактум.
Как диагностировать
Вставь Atomics.load() для проверки — он вернет актуальное значение и выявит «битые» данные. Но без Atomics.store() запись остается неатомарной.
Лечение: только Atomics
Используй
Типичная ошибка
Игнорировать атомарность на write-heavy сценариях. «Оптимизация» без Atomics кончится багом, который воспроизводится через раз. Не пытайся экономить на синхронизации — это ломает production.
Вывод: При конкурентной записи в SharedArrayBuffer из разных воркеров используй только целочисленные Atomics-методы — любая другая запись гарантирует state corruption на уровне памяти.
Когда два worker_thread пишут в один SharedArrayBuffer, состояние памяти может разрушиться без видимых исключений. Особенно это заметно на ARM: вместо ожидаемых 0xFF00FF00 и 0x00FF00FF получается 0x0000FFFF — байты частично обновляются и перемешиваются. Частая ошибка — думать, что «просто запись» в SharedArrayBuffer безопасна без Atomics.
Почему это ломается
Два воркера одновременно пишут в соседние ячейки Uint32Array. Кэш-линии процессора конфликтуют, и результат — частичное обновление. В production это проявляется как расходящиеся данные или краши без явной причины. Диагностика сложна: console.log с двоичным выводом может показать мусор, но только постфактум.
Как диагностировать
Вставь Atomics.load() для проверки — он вернет актуальное значение и выявит «битые» данные. Но без Atomics.store() запись остается неатомарной.
Atomics.load(buffer, index) — первый шаг к обнаружению гонки. Если видишь неожиданные значения, проблема точно в синхронизации.Лечение: только Atomics
Используй
Atomics.store, Atomics.load, Atomics.exchange — это единственный надежный способ. Подходят только целочисленные массивы: Int32Array, Uint32Array, BigInt64Array. Float не поддерживается. Для сложных структур применяй Atomics.compareExchange и спин-лок:const lock = new Int32Array(sab, 0, 1);
while (!Atomics.compareExchange(lock, 0, 0, 1)) {
// spin
}
// работа с shared данными
Atomics.store(lock, 0, 0);
Atomics.isLockFree() для Int32 возвращает true — это быстрее мьютексов. Ошибка: попытка обойти Atomics через Buffer.writeInt32LE или DataView — это не атомарно, особенно на разных ядрах.Типичная ошибка
Игнорировать атомарность на write-heavy сценариях. «Оптимизация» без Atomics кончится багом, который воспроизводится через раз. Не пытайся экономить на синхронизации — это ломает production.
Вывод: При конкурентной записи в SharedArrayBuffer из разных воркеров используй только целочисленные Atomics-методы — любая другая запись гарантирует state corruption на уровне памяти.
Forwarded from ai.dot(ufna, dev)
Мелкомягкие режут кажется единственную студию, у которой все было хорошо.
Единственную НУЖНУЮ студию там у этих мелкомягких.
Пора ли уходить с гитхаба в знак протеста? Они покусились на святое! Где мои ДЛЦ для дума??!
https://www.techtimes.com/articles/318653/20260618/zenimax-layoffs-begin-id-software-doom-developers-face-xbox-reset-cuts.htm
Единственную НУЖНУЮ студию там у этих мелкомягких.
Пора ли уходить с гитхаба в знак протеста? Они покусились на святое! Где мои ДЛЦ для дума??!
https://www.techtimes.com/articles/318653/20260618/zenimax-layoffs-begin-id-software-doom-developers-face-xbox-reset-cuts.htm
Tech Times
ZeniMax Layoffs Begin: id Software and Doom Developers Face Xbox Reset Cuts
ZeniMax layoffs have reportedly begun, with sources warning cuts at Bethesda parent will be deeper than expected. Developers at id Software, MachineGames, and Arkane Lyon are not considered safe under the Xbox Reset — only Fallout and Elder Scrolls teams…
Forwarded from ai.dot(ufna, dev)
У кого-то клод плещет такими словами как "гоча", у меня — "заземлиться".
Каждый раз тянет на грядки. Я бы выращивал помидоры!
Каждый раз тянет на грядки. Я бы выращивал помидоры!
Forwarded from PSD | Дизайн-пространство
Как мы сделали NFT для сотрудников, или Конструктор эмоций в мире чётких процессов
Узнай, как HR Tech команда Альфы создала инновационную «Открыточную» для доставки эмоций сотрудникам. Следи за Машей, лидером стрима, и их удивительными успехами!
Читать на дизайнерс | #статья
Узнай, как HR Tech команда Альфы создала инновационную «Открыточную» для доставки эмоций сотрудникам. Следи за Машей, лидером стрима, и их удивительными успехами!
Читать на дизайнерс | #статья