Rails 7.2 на проде ...
 
Уведомления
Очистить всё

Rails 7.2 на проде вторую неделю: впечатления и пара граблей

4 Сообщения
4 Пользователи
2 Реакции
645 Просмотры
gosha70
Сообщения: 17
Автор темы
Пишет тесты бэкенд-разработчик, удалёнка
Присоединился: 3 года назад
[#49]

Работаю удалённо на московскую компанию, у нас GraphQL API на Rails, Ruby 3.3.4. С 7.1 на 7.2 перешли за три дня, легче, чем ожидал. Что всплыло.

Rails.application.secrets в 7.2 уже удалён, а в одном старом инициализаторе он остался, падало при старте. Хорошо, что поймали на стейдже.

ActiveRecord::Base.connection теперь мягко устаревший, предлагают with_connection или lease_connection. Ничего не падает, но в логах тестов предупреждения пачками, его дёргали в паре сервисов ради сырого SQL.

YJIT после load_defaults 7.2 включается сам, если Ruby 3.3. Мы его раньше включали руками через переменную окружения, теперь убрали. Время ответа почти не изменилось, оно и так было с YJIT. Кто ещё сидит на старом Ruby, имейте в виду, что 7.2 требует минимум 3.1.


3 ответа
TimurK62
Сообщения: 31
Читает чужие PR бэкенд-разработчик
Присоединился: 3 года назад

С YJIT на 3.3 я мерил на похожем API: p95 со 140 до 115 мс, память на процесс Puma плюс 35-40 МБ. Если вы его уже включали руками, разницы и не должно быть. Проверить, что он правда работает, можно RubyVM::YJIT.enabled? в консоли на проде.


Ответ
Юлия Макарова
Сообщения: 8
Разобрался с блоками бэкенд-разработчица
Присоединился: 2 года назад

а with_connection чем лучше, если там всё равно один запрос?


Ответ
1 ответ
kostya.sokurov
Присоединился: 4 года назад

Держит прод бэкенд-разработчик, senior
Сообщения: 73

Он берёт соединение из пула только на время блока и сразу возвращает. Старый connection держит его за потоком до конца запроса или джобы. В Puma с пятью потоками и пулом на пять это незаметно, а в фоновом воркере, где поток живёт долго, соединения кончаются в самый неудобный момент. Плюс по коду сразу видно, где кончается работа с базой, на ревью удобно.

ActiveRecord::Base.with_connection do |conn|
  conn.select_value("SELECT count(*) FROM orders WHERE created_at > now() - interval '1 day'")
end

Ответ