body-parser
для анализа данных формы.Этот выпуск в основном исправляет проблемы с HTTP/2, которые не были упомянуты в документации Node.js.
connfilter
был удален параметр установки таймаута для сокетов HTTP/2, что вызывало ошибку segmentation fault; причины можно найти в описании ниже.http2
добавлен метод setTimeout
, чтобы гарантировать закрытие сокетов при истечении времени ожидания событий secureConnection
.titbit
на основе вышеописанных исправлений удалены ненужные участки кода.Проблемы, возникающие из-за мест, где не указаны точки триггеров таймаута, не были упомянуты в документации Node.js. В предыдущей записи баг-трекера было отмечено, что требуется слушать события
error
для сокетов в событияхsecureConnection
, чтобы избежать аварийного завершения службы HTTP/2 при запуске.
При стабильной работе службы HTTP/2, таймауты для сокетов являются необходимыми, иначе вы столкнетесь с тем, что использование
ab
для тестирования параллельных запросов HTTP/1.1 приведет к тому, что большое количество соединений не будет закрыто, занимая ресурсы. Хотя установка таймаута для сокетов в событияхconnection
может закрывать просроченные соединения, это приводит к ошибкам segmentation fault при уничтожении объектов верхнего уровня, основанных на сокете, во время последующих запросов, что приводит к немедленному завершению программы.> Добавление таймаутов через слушатель событийtimeout
практически не оказывает влияния на службы, созданные с помощьюcreateSecureServer
.
Для HTTP/1 все эти изменения не имеют значения, HTTP/1 остаётся самой стабильной службой.
В крайних случаях возможно, что значение охлаждения будет постоянно увеличиваться. Хотя это само по себе не является проблемой, такое поведение может помешать автоматическому завершению программы (kill), как следствие процесс может продолжаться бесконечно, а количество базовых процессов больше не будет восстанавливаться до нормального уровня.
cluster.worker.kill
для грациозного завершения работы.body
как объекта в контексте пула кэширования запросов поле было установлено как null
, что привело к невозможности установки его свойств.В случае, если обновление до последней версии невозможно по какой-либо причине, можно использовать следующий способ решения проблемы через добавление middleware:
app.use(async (c, next) => {
c.body = {};
await next();
}, { pre: true });
helper
добавлен параметр encoding
в функцию hamcsha1
, который указывает кодировку; по умолчанию значение параметра равно hex
. Также были скорректированы параметры data
и key
, сделав data
первым аргументом, а key
— вторым.Несколько небольших оптимизаций, не оказавших влияние ни на разработку, ни на выполнение.
Добавлено несколько строк кода для проверки: если система Windows, то во время запуска процесса Master запускается таймер для периодического отслеживания количества дочерних процессов и поддержания его стабильным. Это связано с тем, что Windows не поддерживает механизм сигналов, поэтому мониторинг выхода дочернего процесса через сигналы недействителен.
Предыдущий механизм обработки сообщений на основе событий message игнорировал параметр handle, поскольку при использовании фреймворка передача сокетов редко применяется. Теперь параметр handle включен, хотя он используется редко; полная поддержка обеспечивает более широкую применимость.
Эта функциональность добавляется через метод app.setMsgEvent. Модули monitor и logger основаны на этом.
Удалены некоторые бесполезные комментарии.
В модули http1.js и http2.js добавлено одно свойство для поддержки расширения titbit-httpc.
Запросил оптимизацию модуля фильтрации, заменив объект на карту (map).
Улучшена функциональность управления таймаутами сокета, что было сделано с учётом протокола HTTP/2.
HTTP/2 имеет проблему сегментации, связанную с таймаутом, которая до сих пор остаётся открытой в багтрекере Node.js на GitHub. В общем, проблема возникает после завершения запроса, когда начинается задержка, а затем происходит таймаут. Обычное использование обычно не вызывает этой проблемы; она была обнаружена намеренно во время тестирования.
Этот выпуск не влияет на производительность и остаётся эффективным. Это небольшое исправление.
Улучшение функции тайм-аута для HTTP/2.
Использование HTTP/1 обеспечивает стабильность.
Кажется, что HTTP/2 действительно имеет свои сложности; достаточно взглянуть на количество ошибок в Node.js и Golang для HTTP/2...
Дальнейшая оптимизация маршрутизации значительно повысила производительность. В текущих условиях обработка маршрутов без параметров в консервативной среде позволяет достигать более одного миллиона запросов в секунду. При использовании параметров :param и *param, при наличии 200 маршрутов, в сложных случаях (с четырьмя или пятью параметрами, а также с большим количеством символов /// для фильтрации) частота запросов увеличилась с более чем 90 000 до более чем 120 000 в секунду. Для ещё более сложных случаев с параметрами, частота запросов была оптимизирована с 50 000 до 60 000 в секунду до более чем 90 000.
Тестирование проводилось на оборудовании с процессором AMD Ryzen 4500U.