ojhub-openrust - открытая реализация части бекенда Object Hub на Rust, работающая как горячая замена для index-роута и загрузчика версий openGo, плюс отправка веб-пушей.
Object hub - платформа для Object Show Community, с упором на собственный вики движок и СМИ. Мы намеренно отказались от популярных веб стандартов в пользу производительности сайта - в теории Интерфейс клиента Object hub работает в стабильные 60 фпс даже на слабых Chromebook'ах (потому что весь движок был написан на Athlon 64 X2)!
openGo уже дал нам 13 мегабайт idle против 150 у nodejs. openRust не заменяет openGo целиком - он берёт на себя конкретные горячие участки (og-теги, загрузчик, веб-пуши), где нативная скорость и отсутствие GC особенно ценны, плюс лично для меня это была возможность освоить действительно низкоуровневый язык.
openRust был сделан за ~24 часа с нуля, включая изучение самого языка. За это время реализованы og-теги для всех доменов сайта (проекты, вики, новости, вакансии), version loader, отправка веб-пушей через VAPID, и трёхуровневый механизм передачи управления (openRust → openGo → legacy-php) через специальные HTTP коды ответа.
Так как php/go бекенды этого сайта работают на FreeBSD мы намеренно отказались от излишней инфраструктуры с целью тотальной портируемости этой реализации.
Смотри README openGo - причины те же, стиль сохраняется единым по всему проекту.
- Nginx, желательно самый последний, с поддержкой
proxy_intercept_errors - Mariadb 11.8, но можно любую другую современную версию
- Rust 1.97+ (stable)
- openGo как fallback-слой (см. коды ответа 398/399)
- Проприетарный legacy-php как последний fallback-слой
- Минимальное потребление ресурсов
- Высокая портируемость
- 100% совместимость с legacy-php и openGo по поведению
- 100% совместимость с поддерживаемыми версиями object hub
- Нормальная и задокументированная инфраструктура
openRust не реализует все эндпоинты сайта. Для путей, которые уже реализованы в openGo, но ещё не в openRust, сервис возвращает HTTP код 398 - nginx перехватывает его и перенаправляет запрос в openGo. Для путей, не реализованных нигде из двух, возвращается 399 - fallback уходит сразу в legacy-php. Тот же принцип, что DropPhp в openGo, просто на уровень выше.
- Продакшн? да
- Loader 1.20? да, урезанная таблица версий без мёртвых версий
- Сколько эндпоинтов реализовано? 3 из ~65 (index, loader, send-push) + fallback-механизм на все остальные
- Что будет портировано следующим? бизнес-логика подписок на веб-пуши
- Что будет исправлено дальше? очередь отправки пушей, если нагрузка это реально потребует
- Что я сделаю когда настроение будет? вынести список версий из статики в конфиг/БД, чтобы не пересобирать бинарник при каждом обновлении client-side файлов