umbot спроектирована с прицелом на высокую производительность и предсказуемое время отклика. Это особенно
важно, учитывая жёсткие ограничения по времени от платформ (например, 3 секунды для Яндекс.Диалогов).
Этот документ описывает:
Все данные получены в контролируемых условиях и воспроизводимы — вы можете запустить тесты самостоятельно.
В типичных сценариях (до 1 000 команд) внутренняя обработка umbot занимает менее 30 мс для холодного запуска.
Это включает:
Первичная загрузка медиафайлов
При первом использовании изображения или аудиофайла фреймворк загружает его на сервер платформы и кэширует токен.
Эта операция может занять от 200 мс до 1+ секунды, в зависимости от размера файла и загрузки серверов
платформы.
→ Решение: предварительно загрузить ресурсы через Preload.
Холодный запуск с большим числом сложных регулярных выражений
При первом вызове с 10 000+ непрокэшированных регулярок время может достичь 200–500 мс.
→ Решение: использовать re2, проверять регексы на ReDoS, прогревать кэш при старте.
⚠️ Важно: время выполнения пользовательской логики (ваш код в
addCommandилиaction) не входит в эти цифры. Если ваш обработчик работает 2.5 сек — это ваша зона ответственности.
umbot — это мультиплатформенный фреймворк, тогда как Telegraf, vk-io, alice-kit и т.д. — специализированные SDK.
Прямое сравнение производительности некорректно по нескольким причинам:
umbot обеспечивает единый API для всех платформumbot измеряют чистое время маршрутизации команд, в то время как другие библиотеки часто включают сетевое взаимодействие с API платформumbot оптимизирован для сценариев, где важна поддержка нескольких платформ с одним кодомКлючевой вывод: в реальных проектах узким местом почти всегда становится либо API платформы (ограничения на RPS), либо ваша бизнес-логика (работа с БД, внешними сервисами) — но не маршрутизация команд.
Даже при пиковой нагрузке ядро umbot (16 000+ RPS в бенчмарках) обрабатывает запросы быстрее, чем:
Даже в "реальных" условиях (с фоновой нагрузкой) umbot показывает 16 000+ RPS.
Что это значит на практике:
umbotРезультаты тестирования: На сервере 2 ядра / 4 ГБ RAM (FirstVDS, тариф «Разгон», фоновая нагрузка: 3 сайта + 10 навыков + MariaDB):
На чистом сервере 1 ядро / 1 ГБ RAM(без фоновой нагрузки, только бенчмарк):
⚠️ Важно: RPS сильно зависит от окружения. Цифры выше — ориентиры для сравнения сценариев, а не гарантии. На менее нагруженной системе достигается более высокий RPS
📊 Контекст: Популярные платформы имеют различные ограничения на частоту запросов — от десятков до нескольких тысяч в секунду в зависимости от тарифа и типа запроса. Показатели umbot находятся на уровне или выше этих ограничений, что означает, что фреймворк не станет узким местом вашего приложения.
Потребление памяти (инкрементальное, разница до/после инициализации):
💡 Абсолютное потребление процесса Node.js (~45–60 МБ) не учитывается — это стоимость среды выполнения, а не фреймворка.
Все тесты открыты и находятся в репозитории:
# Установка
git clone https://github.com/max36895/universal_bot.git
npm install
npm run build
# Тест производительности по количеству команд
npm run bench
# Стресс-тест на параллельные запросы
npm run stress
Полные результаты (включая память, разные типы регулярок, сравнение «первый vs повторный запуск») — в файле BENCHMARKS.md.
✅ Подходит, если:
⚠️ Рассмотрите альтернативы, если:
По умолчанию umbot использует линейный поиск с поддержкой подстрок и регулярных выражений.
Также для команд, обрабатываемых как обычный текст, логика поиска была оптимизирована:
Однако при числе команд >1000 или в условиях высокой нагрузки вы можете подключить собственный алгоритм поиска:
const bot = new Bot();
bot.setCustomCommandResolver((userCommand, commands) => {
// Пример: возврат команды по хэшу (ваши правила)
for (const [name, cmd] of commands) {
if (cmd.slots.some((slot) => userCommand.includes(slot as string))) {
return name;
}
}
return null;
});
💡 Рекомендации:
Сохраняйте порядок перебора, если он критичен для вашей логики. Используйте кэширование (Map<string, string>) для часто встречающихся фраз. Для fuzzy-поиска рассмотрите fuse.js или natural. При использовании регулярок — не забывайте про защиту от ReDoS.
re2Если в вашем приложении используется регулярные выражения для поиска команд, то стоит рассмотреть вариант перехода на re2, за счет чего время обработки может существенно сократиться, а также сократится потребление памяти. При внутреннем тесте при большом числе регулярных выражений (>10 000) использование re2 снизило время обработки в 5–7 раз и уменьшило потребление памяти.
Долгая обработка команд может быть связана:
Если в вашем приложении множество изображений или звуков, то рекомендуется их заранее предзагрузить, иначе загрузка
ресурса будет происходить во время обработки пользовательского запроса, из-за чего скорость отдачи ответа может сильно
упасть. Поэтому стоит заранее подготовить список загружаемых ресурсов, и передать их в Preload.
umbot — это производительный мультиплатформенный фреймворк, который:
Если ваша задача — диалог с пользователем, а не управление чатом, umbot даст вам единый, предсказуемый и масштабируемый
фундамент.