How does Turbo listen for Turbo Streams
Turbo отслеживает Turbo Streams через два механизма. При отправке форм он перехватывает события submit через слушателя на document, предотвращает стандартную отправку и использует fetch API с заголовком Accept: text/vnd.turbo-stream.html. Это сигнализирует серверу, что можно отвечать Turbo Stream элементами. Сервер, в свою очередь, должен вернуть ответ с Content-Type: text/vnd.turbo-stream.html.
Для обработки ответов Turbo использует слушателя события turbo:before-fetch-response. Этот обработчик проверяет тип содержимого ответа и при совпадении добавляет содержимое в DOM. Когда <turbo-stream> элементы добавляются, они автоматически выполняют одно из семи действий (append, prepend, replace и т.д.). Для обычных fetch-запросов разработчикам нужно самостоятельно добавлять заголовок Accept.
Комментарии (8)
- Turbo Streams становятся менее актуальными, так как фреймворк уже сам по себе использует их по умолчанию; оставляем только для специфичных сценариев вроде уведомлений.
- Подписки на каналы и фреймы полезны для изолированных обновлений, но не стоит переусердствовать с ними в ущерб стандартным паттернам.
- Покупатели из ЮВА сталкиваются с отсутствием покупательского паритета; вопрос о ценах и доступности курса остаётся открытым.
- Сообщество обеспокоено, что чрезмерная рельсовость может оттолкнуть не-Ruby разработчиков, которые сейчас используют Turbo вне Rails.
Rails on SQLite: new ways to cause outages
Rails + SQLite: новые способы уронить прод
SQLite встроен в процесс веб-сервера — нет отдельного демона, портов, сокетов; всё хранится в одном файле. Плюс: пропали ошибки подключения к БД. Минус: файл живёт в контейнере, а контейнеры пересоздают, и данные исчезают.
Правило 1: клади БД в персистентное хранилище (EBS, Fly Volumes, …) и включи снапшоты.
Правило 2: веб, кеш, очередь и джобы по умолчанию пишут в тот же файл. Удобно, но воркеры теперь должны видеть этот файл. Запускай воркеры в том же VM, либо разнеси данные по разным БД и настрой database.yml.
Правило 3: SQLite блокирует всю БД на время записи. Параллельные длинные запросы = таймауты. Держи транзакции короткими, используй PRAGMA journal_mode=WAL, synchronous=NORMAL, busy_timeout=5000.
Правило 4: бекапы. sqlite3 db.sqlite3 ".backup backup.sqlite3" — атомарно, без остановки сервиса. Крути каждый час и перед деплоем.
Плюсы:
- FTS5-индекс из коробки
- Мегабайты вместо гигабайтов RAM
- $14/мес на Fly.io при 1 млн запросов
- Нет Redis, Postgres, S3 — только Rails-контейнер
Итог: SQLite позволяет поднять pet-project за вечер, но требует новых привычек: персистентные диски, WAL, короткие транзакции, общий доступ к файлу. Соблюдай правила — и база не уйдёт в /dev/null.
Комментарии (55)
- Автор статьи утверждает, что его сервис «Feed Your Email» возможен только благодаря SQLite, но не объясняет, почему именно SQLite, а не PostgreSQL/MySQL.
- Многие участники считают SQLite удобным для малонагруженных и внутренних приложений из-за простоты развёртывания и отсутствия отдельного процесса БД.
- Критики отмечают: при росте нагрузки появляются проблемы с бэкапами, масштабированием, единственным писателем и отказоустойчивостью, смывая преимущества.
- Часть разработчиков использует обёртки вроде Litestream, Turso или Cloudflare D1, чтобы добавить репликацию и горизонтальное масштабирование к SQLite.
- В сообществе Rails новый тренд — «по-умолчанию SQLite» для быстрого старта MVP, но опытные пользователи предупреждают о риске «выстрелить себе в ногу» при росте проекта.
%CPU utilization is a lie 🔥 Горячее
%CPU — обманка
Система показывает 50 % загрузки, но реально сервер выполняет 60–100 % максимально возможной работы.
Эксперимент
Ryzen 9 5900X (12 ядер / 24 потока), Turbo включён.
Скрипт запускал stress-ng двумя способами:
- 24 потока по 1–100 % нагрузки;
- 1–24 потока по 100 %.
Результаты
- Общий CPU-тест: при 50 % «утилитой» реальная работа 60–65 %.
- 64-битная математика: 65–85 %.
- Умножение матриц: 80–100 %.
Почему так
- Hyper-threading: после 12 потоков «ядра» делят ресурсы, прирост стремится к нулю.
- Turbo: частота падает с 4.9 до 4.3 ГГц при росте загрузки, поэтому «утил» растёт быстрее реальной работы.
Вывод
Полагаться на линейный рост %CPU — ошибка. При эффективной загрузке (>50 %) показания занижены, и различия между процессорами могут быть огромными.
Комментарии (134)
- Участники сходятся во мнении, что «%CPU» — это не ложь, а линейная мера нелинейной реальности: SMT, Turbo, общие ресурсы и ожидание памяти делают 60 % «загрузки» фактически пределом.
- Практики SRE подтверждают: модели очередей по CPU% работают лучше «старой мудрости», но только если понимать, что 50–60 % уже «почти всё».
- Несколько человек вспомнили, как менеджеры требовали «увеличить сервер», увидев 100 %, хотя процессор простаивал в busy-wait или ждал I/O.
- Подчёркивается, что IPC, latency, power-draw и прямое нагрузочное тестирование приложения дают более точную картину, чем сырые проценты.
- Утилита stress-ng удобна для синтетики, но не для production-бенчмарков; реальные приложения (Postgres, Memcached) ломаются раньше, чем показывает 100 % CPU.