Forwarded from Dezzigners
Forwarded from Node.JS [ru] | Серверный JavaScript
Зависание HTTP/2 прокси: как кастомные priority-фреймы убивают flow control
Когда параллельные стримы с разными приоритетами перестают отвечать, сессия жива, но данные не идут - проблема не в сети, а в управлении потоком. Разработчики часто путают висящие стримы с сетевыми таймаутами, теряя часы на отладку.
Две ловушки flow control
HTTP/2 имеет два окна управления потоком: на сессию (65535 байт по умолчанию) и на каждый стрим. При кастомных приоритетах (например, weight=256 у одного стрима и weight=1 у остальных) прокси начинает насыщать только приоритетный стрим. Остальные ждут, окно соединения исчерпывается - дедлок неизбежен.
Как диагностировать залипание
Чтобы поймать проблему:
- Смотри WINDOW_UPDATE фреймы. Если их число падает на уровне сессии, а на стримах нет - сигнал тревоги.
- Включи логирование priority. Когда более 80% веса приходится на один стрим, жди беды.
- Попробуй увеличить initial window size до мегабайта. Если зависание исчезает, копай в flow control.
Простой пример на Node.js
Вот как управлять окном приоритетов:
Типичная ошибка и её решение
При кастомных приоритетах убедись, что сумма весов не даёт перекоса под 80% на один стрим. Следи за stream.state: если localWindowSize почти ноль, а remoteWindowSize нет - это залипание. На прокси-сервере проверяй, не блокирует ли nghttp2 флаг NGHTTP2_FLAG_PRIORITY_OPEN.
Вывод: Контроль баланса весов приоритетов и мониторинг WINDOW_UPDATE фреймов на уровне сессии критичен для предотвращения дедлоков в параллельных стримах HTTP/2.
Когда параллельные стримы с разными приоритетами перестают отвечать, сессия жива, но данные не идут - проблема не в сети, а в управлении потоком. Разработчики часто путают висящие стримы с сетевыми таймаутами, теряя часы на отладку.
Две ловушки flow control
HTTP/2 имеет два окна управления потоком: на сессию (65535 байт по умолчанию) и на каждый стрим. При кастомных приоритетах (например, weight=256 у одного стрима и weight=1 у остальных) прокси начинает насыщать только приоритетный стрим. Остальные ждут, окно соединения исчерпывается - дедлок неизбежен.
Как диагностировать залипание
Чтобы поймать проблему:
- Смотри WINDOW_UPDATE фреймы. Если их число падает на уровне сессии, а на стримах нет - сигнал тревоги.
- Включи логирование priority. Когда более 80% веса приходится на один стрим, жди беды.
- Попробуй увеличить initial window size до мегабайта. Если зависание исчезает, копай в flow control.
Простой пример на Node.js
Вот как управлять окном приоритетов:
const http2 = require('http2');
const { HTTP2_HEADER_PATH, HTTP2_HEADER_METHOD } = http2.constants;
const client = http2.connect('https://example.com');
client.setLocalWindowSize(1048576);
async function sendRequest(path) {
return new Promise((resolve, reject) => {
const stream = client.request({
[HTTP2_HEADER_PATH]: path,
[HTTP2_HEADER_METHOD]: 'GET',
});
let data = '';
stream.on('data', chunk => data += chunk);
stream.on('end', () => resolve(data));
stream.on('error', reject);
});
}
Promise.all([
sendRequest('/api/1'),
sendRequest('/api/2'),
sendRequest('/api/3')
]);Типичная ошибка и её решение
При кастомных приоритетах убедись, что сумма весов не даёт перекоса под 80% на один стрим. Следи за stream.state: если localWindowSize почти ноль, а remoteWindowSize нет - это залипание. На прокси-сервере проверяй, не блокирует ли nghttp2 флаг NGHTTP2_FLAG_PRIORITY_OPEN.
Вывод: Контроль баланса весов приоритетов и мониторинг WINDOW_UPDATE фреймов на уровне сессии критичен для предотвращения дедлоков в параллельных стримах HTTP/2.
Forwarded from Shock Design
This media is not supported in your browser
VIEW IN TELEGRAM
Немецкий художник Мелвин Вернер первым в мире освоил технику живописи в негативе: при наложении фильтра его картины мгновенно обретают насыщенные цвета.
Forwarded from Дизайн-Телега 🔥
This media is not supported in your browser
VIEW IN TELEGRAM
Плагин Blurhash — инструмент для создания и применения Blur Hash прямо в Figma — преобразует размытые фреймы в компактные коды, удобные для прелоада изображений.
#blurhash #код #генератор #размытие #прелоад #оптимизация
#blurhash #код #генератор #размытие #прелоад #оптимизация
Forwarded from Daily Coding 🔥
📖Blazor Web Development Cookbook
🖋Pavel Bazyluk 2023
Благодаря поддержке хостинга как на стороне сервера, так и на стороне клиента, а также возможности комбинировать режимы рендеринга, Blazor позволяет использовать облачные вычисления, сохраняя при этом производительность локальных приложений. Павел Базылюк — эксперт по Blazor с более чем десятилетним опытом работы с .NET-технологиями — расскажет, как с помощью Blazor, фреймворка от Microsoft, создавать интерактивные веб-приложения на C# и .NET, снижая зависимость от JavaScript. В этой кулинарной книге представлены широкие возможности Blazor на примере практических рецептов, которые раскрывают ключевые аспекты веб-разработки и демонстрируют универсальность фреймворка для создания современных интегрированных приложений.
💾 Скачать книгу
Daily Coding #книги #web & Max
🖋Pavel Bazyluk 2023
Благодаря поддержке хостинга как на стороне сервера, так и на стороне клиента, а также возможности комбинировать режимы рендеринга, Blazor позволяет использовать облачные вычисления, сохраняя при этом производительность локальных приложений. Павел Базылюк — эксперт по Blazor с более чем десятилетним опытом работы с .NET-технологиями — расскажет, как с помощью Blazor, фреймворка от Microsoft, создавать интерактивные веб-приложения на C# и .NET, снижая зависимость от JavaScript. В этой кулинарной книге представлены широкие возможности Blazor на примере практических рецептов, которые раскрывают ключевые аспекты веб-разработки и демонстрируют универсальность фреймворка для создания современных интегрированных приложений.
💾 Скачать книгу
Daily Coding #книги #web & Max
Forwarded from Node.JS [ru] | Серверный JavaScript
В Strapi есть забавная особенность: формат ответа напрямую зависит от того, что ты ГОВОРИШЬ ему в запросе. Попросил статью без
Авторы разбирают, как выкрутиться из этой задницы через кодогенерацию: вытягиваешь схему с живого Strapi, по ней генеряешь TypeScript-клиент и заставляешь систему типов на этапе компиляции вычислять тип ответа прямо из параметра
Читать статью
👉 Node.JS [ru]
populate — на тебе голые скалярные поля. Сунул populate: { category: true } — и уже подтянулась вложенная категория. А если еще и fields: ['name'] добавил внутрь — она придет обнуленной. Получается, один и тот же эндпоинт возвращает кучу разных форм, и стандартный TypeScript-интерфейс нормально не опишешь: он либо обманывает, заявляя поля, которых в ответе на самом деле нету, либо просто бесполезен, превращаясь в то самое any.Авторы разбирают, как выкрутиться из этой задницы через кодогенерацию: вытягиваешь схему с живого Strapi, по ней генеряешь TypeScript-клиент и заставляешь систему типов на этапе компиляции вычислять тип ответа прямо из параметра
populate. Принцип — как у Prisma: что передал в вызов, то тебе типы и вернут. Код на TypeScript, сам клиент опенсорсный под лицензией MIT.Читать статью
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from ai.dot(ufna, dev)
А Doom Revelations продолжает меня расстраивать. Кажется, это первый из думов, который я либо брошу, либо пробегу почекать сюжетку.
Откровенно левенькие арены, откровенно странный акцент на гребанный цирк с переключением. Насколько был хорош этернал — где каждая арена это мини-произведение искусства и баланс, настолько здесь — все сыро, безидейно, и.. попросту скучно.
Нет тактики боя, есть упражнение на нажатие кучи клавишь. Фу.
Откровенно левенькие арены, откровенно странный акцент на гребанный цирк с переключением. Насколько был хорош этернал — где каждая арена это мини-произведение искусства и баланс, настолько здесь — все сыро, безидейно, и.. попросту скучно.
Нет тактики боя, есть упражнение на нажатие кучи клавишь. Фу.