Skip to content
RoadRunner 3

Вышел RoadRunner 3 ​

Рады сообщить, что мы выпустили RoadRunner 3.

RoadRunner 3 - последняя мажорная версия в обозримом времени с супер стабильным API. К этому релизу мы закрыли бэклог предыдущих версий RoadRunner и вернули понятную схему версионирования: избавились от календарных версий и вернулись к SemVer. RoadRunner 3 продолжит получать исправления ошибок и обновления безопасности, однако основные силы команды теперь направлены на развитие Rapira.

Ниже описано, что изменилось в сервере и PHP-пакетах и как обновиться.

Главные изменения ​

Полный список есть в заметках к релизу. Основное:

  • Плагины в стандартной сборке. Добавлены драйвер очередей NSQ, HTTP rate limiting, сжатие Zstd и реестр protobuf (Protoreg). TCP-плагин удалён.
  • HTTP. Поддержка PROXY protocol v1 и v2 с явным списком доверенных прокси. Middleware rate_limiter возвращает 429 с Retry-After. В static появились настройки кешей и команда rr reset static.
  • gRPC. Server reflection через Protoreg и детали google.rpc.Status в логах ошибок.
  • Jobs. Именованные пулы воркеров: пайплайн можно привязать к отдельному пулу PHP-воркеров. AMQP поддерживает именованные подключения к разным брокерам. Kafka умеет читать выбранные партиции.
  • Lock. Новый бэкенд Redis для блокировок между несколькими экземплярами RoadRunner.
  • Logger. Логгер переведён на Go log/slog, запись в вывод стала неблокирующей.
  • Unix-сокеты. Для слушателей и relay воркеров можно задать права, владельца и группу.
  • Status. /livez и /readyz работают как алиасы /health и /ready.

Ломающие изменения ​

Пошаговый список - в руководстве по обновлению с v2025 на v3. Самое заметное:

ОбластьЧто изменилось
HTTP middlewareЗапрос проходит http.middleware слева направо. Чтобы сохранить прежний порядок, разверните список.
HTTP/2Cleartext HTTP/2 работает только через prior knowledge. Upgrade: h2c больше не поддерживается.
AMQPНастройки брокера переносятся в именованные подключения, config.version удалён.
Loggerfile_logger_options и встроенная ротация удалены. Используйте output и внешний инструмент ротации. При переполнении очереди новые записи отбрасываются.
ТрейсингНативный экспортер Zipkin удалён. Используйте OTLP.
RPCGoridge v4 не поддерживает MessagePack. Доступны JSON, protobuf, Gob и raw.
JobsЗаголовок pool зарезервирован для маршрутизации в именованный пул. pipeline_size по умолчанию теперь 100000.
NATSПри остановке пайплайна стрим по умолчанию сохраняется.
CentrifugeМетод centrifuge.RateLimit удалён.
envfileКорневой envfile загружается без experimental-режима. Указанный файл должен существовать.
server.on_init.envЗначения переопределяют унаследованные переменные окружения.
TCP-плагинНе поддерживается в RoadRunner 3.

В корне .rr.yaml по-прежнему указывается version: "3". Для сборки из исходников нужен Go 1.27 или новее. Авторам Go-плагинов нужно перейти на api-go/v6, api-plugins/v6, pool/v2, goridge/v4 и *slog.Logger. Сборщик Velox использует новую конфигурацию модулей, а удалённый сервер сборки и цели Windows из него убраны. Готовые бинарники для Windows в релизе есть.

PHP-пакеты ​

Вместе с сервером обновились и PHP-пакеты. Основное:

  • Минимальная версия PHP: 8.2.
  • Новое имя вендора roadrunner/* для всех пакетов (вместо spiral/* и roadrunner-php/*).
  • Неймспейсы классов не изменились ради обратной совместимости.
  • Каждый новый пакет объявляет replace старого имени с self.version. Исключение — метапакет, о нём ниже.
  • Метапакет spiral/roadrunner теперь называется roadrunner/roadrunner. Пакеты roadrunner/* требуют roadrunner/roadrunner ^3.0. Переименование пакета оградило нас от нескольких проблем:
    • Календарные версии 2023.x–2025.x, не соответствующие SemVer, постоянно всплывали как стабильные последние версии. CalVer остался в spiral/roadrunner.
    • Advisory CVE-2025-22871 отмечена как уязвимость для spiral/roadrunner < 2025.1.0, что блокировало установку RoadRunner 3 через Composer. С новым именем этого бремени нет.
  • Все пакеты требуют RoadRunner 3. Работа старых версий RoadRunner с новыми пакетами не гарантируется.
  • TCP-плагин выпилен из RoadRunner 3. Приложениям с TCP-плагином рекомендуется остаться на RoadRunner v2025. Это не касается транспорта tcp:// для RPC и relay воркеров: он работает как раньше.

Полировка:

  • Тесты переписаны на Testo.
  • Показатели Code Coverage, Mutation Testing и Static Analysis улучшены.
  • RoadRunner CLI 3.0.0 скачивает бинарники через DLoad.
Старое имяНовое имяСтатус
spiral/roadrunnerroadrunner/roadrunnerВерсия
spiral/roadrunner-workerroadrunner/workerВерсия Psalm Покрытие MSI
spiral/roadrunner-httproadrunner/httpВерсия Psalm Покрытие MSI
spiral/roadrunner-grpcroadrunner/grpcВерсия Psalm Покрытие MSI
spiral/roadrunner-jobsroadrunner/jobsВерсия Psalm Покрытие MSI
spiral/roadrunner-kvroadrunner/kvВерсия Psalm Покрытие MSI
spiral/roadrunner-metricsroadrunner/metricsВерсия Psalm Покрытие MSI
spiral/roadrunner-servicesroadrunner/servicesВерсия Psalm Покрытие MSI
spiral/goridgeroadrunner/goridgeВерсия Psalm Покрытие MSI
spiral/roadrunner-cliroadrunner/cliВерсия Psalm Покрытие MSI
roadrunner-php/app-loggerroadrunner/app-loggerВерсия Psalm Покрытие MSI
roadrunner-php/centrifugoroadrunner/centrifugoВерсия Psalm Покрытие MSI
roadrunner-php/lockroadrunner/lockВерсия Psalm Покрытие MSI
roadrunner-php/symfony-lock-driverroadrunner/symfony-lock-driverВерсия Psalm Покрытие MSI
roadrunner-php/version-checkerroadrunner/version-checkerВерсия Psalm Покрытие MSI
roadrunner-php/roadrunner-api-dtoroadrunner/api-dtoВерсия

Для миграции замените имена и версии в composer.json.

Ещё стабильнее ​

RoadRunner и раньше давал самую надёжную интеграцию с PHP: что может быть стабильнее STDIN/STDOUT? Но даже здесь в версии 3 мы нашли, что улучшить: потребление памяти стало ровнее, а производительность ещё немного выросла.

Потребление памяти RoadRunner v2025, RoadRunner v3 и Rapira dispatcher при растущей нагрузке

Однако если вам нужна максимальная производительность HTTP- или gRPC-эндпоинтов, возможно, пришло время присмотреться к Rapira.

Обновлено: