Meteor 3.5 позволяет разработчикам отказаться от SockJS в пользу uWebSockets.js с помощью одной переменной окружения, обещая заметное снижение нагрузки на CPU, RAM и затрат на сборку мусора для приложений, которые активно используют вызовы методов.

Почему это важно

С момента своего запуска Meteor направлял каждое сообщение DDP (Distributed Data Protocol) через SockJS — JavaScript-запасной вариант (fallback), который работает везде, но никогда не проектировался для достижения максимальной скорости. Новый релиз отделяет транспортный уровень, предоставляя точку подключения (plug-in point), которая принимает любую реализацию WebSocket, соответствующую ожиданиям DDP. Установка DDP_TRANSPORT=uws при запуске заменяет стандартный вариант на uWebSockets.js — сервер на базе C/C++, известный своей высокой пропускной способностью.

Аспект производительности

Бенчмарки, прилагаемые к релизу, показывают:

  • Потребление CPU снизилось на 9%
  • Потребление RAM снизилось на 11%
  • Время пауз сборки мусора сократилось на 26%
  • Пропускная способность выросла в 1,6 раза в микробенчмарках

Этот прирост наблюдается в приложениях, выполняющих множество вызовов методов в стиле RPC. Сам транспорт становится «узким местом» только после оптимизации бизнес-логики приложения, поэтому переход может напрямую привести к снижению затрат на серверы.

Как попробовать уже сегодня

Отдельный бинарный файл не требуется — достаточно Meteor 3.5. Запустите приложение с помощью:

DDP_TRANSPORT=uws meteor run

Сервер uWebSockets.js слушает свой собственный порт (по умолчанию 5001). Если несколько экземпляров Meteor работают на одном хосте, каждому необходимо назначить отдельный uws.port через METEOR_SETTINGS, чтобы избежать конфликтов.

Кому это выгодно, а кто не заметит большой разницы

  • Нагрузки с интенсивным использованием RPC — сервисы, вызывающие множество методов на один запрос, смогут сэкономить циклы CPU и память, что облегчит масштабирование.
  • Приложения, ориентированные на Pub/Sub — большая часть задержек в паттернах «издатель-подписчик» (publish/subscribe) связана с вычислениями разницы данных (data-diff), а не с транспортом, поэтому прирост скорости будет скромным.

Изменение является опциональным; SockJS остается вариантом по умолчанию, сохраняя совместимость со средами, где нативные WebSockets недоступны.

Компромиссы и предостережения

Переключение транспорта добавляет небольшой операционный шаг: управление дополнительным портом и обеспечение того, чтобы он не конфликтовал с другими сервисами. Поскольку uWebSockets.js является нативным модулем, он требует стандартного внимания к бинарным зависимостям: на хосте развертывания должны быть инструменты сборки, а любые будущие обновления библиотеки необходимо будет тестировать на совместимость с кодовой базой приложения.

Что дальше для транспортного уровня Meteor

Создав четкую границу, Meteor теперь приглашает сообщество экспериментировать с альтернативными транспортами — будь то для специализированных требований безопасности, расширения протоколов или дальнейшей настройки производительности. То, насколько быстро появятся сторонние реализации, покажет, станет ли модульная модель постоянной частью архитектуры Meteor.

Итог: Модульный DDP-транспорт в Meteor 3.5 позволяет заменить устаревший стек SockJS на uWebSockets.js одной командой, обеспечивая до 1,6-кратного увеличения пропускной способности и ощутимую экономию ресурсов для приложений с интенсивным использованием RPC, при этом сохраняя текущие настройки нетронутыми для нагрузок, которым не требуется этот прирост.