Астрологи объявили неделю апдейтов
Следить за обновлениями нет времени? Не беда, мы в Evrone знаем насколько это важно и экономим ваше время, собирая информацию об обновлениях привычных инструментов. Это и многое другое вы найдёте в нашем Ruby-дайджесте.
Jekyll обновлённый
Постоянное взаимодействие с пользователем — идея, на которой базируется большинство веб-приложений. Всё логично, если пользователь много взаимодействует с приложением, то, вероятно, рано или поздно он приобретёт предлагаемый товар или услугу.
Этим пользуются интернет-магазины и разнообразные сервисы. Фактически интерактивность стала драйвером любого онлайн-бизнеса. Это породило тысячи технологий и фреймворков, реализующих интерактивное взаимодействие и генерацию веб-страниц «на лету», исходя из запросов пользователей. Разработчики начинают применять эти технологии везде, даже где не нужно.
Часто это выглядит, как «стрельба из пушки по воробьям» — затрачиваемые усилия несоразмерны результату. Для создания простого сайта-визитки или информационного ресурса с рецептами вовсе не нужен движок или CRM, можно обойтись простым набором статичных веб-страниц. Поэтому генераторы статических сайтов, такие как Jekyll, не теряют своей популярности, становятся аналогом бритвы Оккама с постулатом «не следует множить сущее без необходимости».
На днях вышла версия Jekyll 4.3.0, ставшая очередным важным этапом на пути к пятой версии. Релиз был сфокусирован не на добавлении новых возможностей, а на исправлении ошибок и достижения более предсказуемого поведения. Минимально допустимая версия Ruby была повышена с 2.4 до 2.5, а rubocop c 1.12 до 1.18. В список зависимостей добавился сервер для отладки webrick, а также была улучшена работа с CSV-файлами. Полная история изменений — на сайте проекта.
Релиз Puma 6.0
На конференции Ruby Russia 2022 мы уже упоминали прекрасный доклад Александра Шермана из компании Самокат. Эпичная история переезд с Puma на Falcon за неделю до релиза есть на нашем Youtube-канале. Но значит ли это, что стоит вообще поставить крест на Puma? Вовсе нет! Новая версия 6.0 с кодовым именем Sunflower как раз призвана существенно увеличить производительность. Предлагаем взглянуть, что поменяли разработчики.
Во-первых, была значительно увеличена пропускная способность для ответов с фрагментами данных более 100 Кбайт. Заявленное ускорение составит 3-10 раз по сравнению с предыдущей версией Puma. Для ответов со строками ускорение будет не столь существенным, всего 10%, но для высоконагруженных сервисов даже такая прибавка будет очень приятной.
Во-вторых, примерно в 3 раза стала быстрее отдача ассетов, необходимых для работы веб-приложения.
Также был переосмыслен механизм балансировки нагрузки по процессам. Экспериментальная функция wait_for_less_busy_worker, протестированная в предыдущей версии, доказала свою пользу и включена в Puma 6 по умолчанию. Её предназначение — отправлять запросы в наименее загруженный процесс. Это в свою очередь снижает average latency.
Прошло всего пара месяцев с релиза модульного интерфейса Racks 3. Разработчики Puma не оставили это без внимания и включили экспериментальную поддержку, одновременно попросив сообщать о всех найденных багах. Также новая версия поддерживает Sidekiq 7, вышедший из беты всего неделю назад.
Увы, серьёзные изменения часто ломают существующие наработки. Так, например, обновление методов в Puma::Server поломало некоторые gem’ы, такие как capybara. Так что если надумаете обновляться, то вначале ознакомьтесь со списком изменений.
Альтернатива Capistrano
Если вам хоть раз приходилось задумываться над деплоем RoR-приложения, вы, скорее всего, использовали Capistrano. Это очень простой в освоении инструмент, забирающий на себя всю рутину по деплою и обеспечению отката до предыдущей версии. Работает по SSH и обладает массой возможностей. Весь процесс деплоя разбивается на множество заданий, каждое из которых забирает на себя какую-либо часть процесса. Если любое из заданий фейлит — все возвращается в состояние до начала деплоя.
Но Capistrano хватает не только на деплой. Некоторые системные администраторы с его помощью удалённые серверы настраивают. Современная микросервисная архитектура и повсеместное внедрение контейнеризации становятся причиной создания всё большего количества инструментов деплоя.
Один из таких инструментов, cuber-gem, стал весьма полезной альтернативой Capistrano. Он позволяет выполнять деплой Ruby-on-Rails приложений в K8s так же, как и на обычные виртуальные машины. Сам по себе процесс сводится к созданию файла конфигурации и выполнению единственной команды cuber deploy.
Вот пример Cubefile для развертывания любого Rails-приложения:
app 'myapp'
repo '.'
buildpacks 'heroku/buildpacks:20'
image 'username/myapp'
dockerconfig 'dockerconfig.json'
kubeconfig 'kubeconfig.yml'
migrate 'rails db:migrate', check: 'rake db:abort_if_pending_migrations'
proc :web, 'bundle exec puma', scale: 3
proc :worker, 'bundle exec sidekiq', scale: 2
cron :mytask, '@daily', 'rake mytask'
env 'RAILS_ENV', 'production'
env 'RAILS_LOG_TO_STDOUT', 'enabled'
env 'RAILS_SERVE_STATIC_FILES', 'enabled'
env 'RAILS_MASTER_KEY', File.read('config/credentials/production.key').strip, secret: true
Организация такого деплоя на K8s обойдётся сильно дешевле использования Heroku или аналогичных PaaS-сервисов. Да и неприятная ситуация с облачным vendor lock-in не возникнет. На официальном сайте проекта есть много дополнительной информации, документация и референсы файлов конфигурации.
Быстрейший сериализатор JSON
Напоследок расскажем ещё об одном полезном инструменте — Alba. Название было придумано, как сокращение от слова альбатрос. Эта птица большую часть жизни проводит в небе и летает со скоростью 130 км/ч. Создатель проекта, Okura Masafumi позиционирует Alba, как самый быстрый сериализатор JSON, ссылаясь на общедоступные результаты бенчмарка.
Удобство этого сериализатора в том, что можно гибко подстраивать процесс, переопределяя соответствующие атрибуты. Это может быть и простая сериализация с корневым ключом, и сериализация с ассоциациями. Если же вы не знаете какой объект сериализуется, можно использовать «чёрную магию»
Alba:
Alba.serialize(something)
Достаточно удобная фишка — обработка нулевых значений. Можно преобразовать nil в любое другое значение, например, в пустую строку:
class User
attr_reader :id, :name, :age
def initialize(id, name = nil, age = nil)
@id = id
@name = name
@age = age
end
end
class UserResource
include Alba::Resource
on_nil { '' }
root_key :user, :users
attributes :id, :name, :age
end
UserResource.new(User.new(1)).serialize
# => '{"user":{"id":1,"name":"","age":""}}'
Сериализация JSON внутри HTML-макета также возможна, для этого используется отдельный файл с методом layout:
{
"header": "my_header",
"body": <%= serialized_json %>
}
class FooResource
include Alba::Resource
layout file: 'my_layout.json.erb'
end
Если выделять под это отдельный файл не входит в ваши планы — не беда. Можно определить и применить макет в реальном времени:
class FooResource
include Alba::Resource
layout inline: proc do
{
header: 'my header',
body: serializable_hash
}
end
end
Альтернативно Proc может отдавать не хэш, а строку:
class FooResource
include Alba::Resource
layout inline: proc do
%({
"header": "my header",
"body": #{serialized_json}
})
end
end
Обратите внимание, что используется знак процента для использования двойных кавычек. Одинарные кавычки в этом случае дадут ошибку.
Это лишь малая часть возможностей Alba. Автор не поленился и создал примеры кода практически на все возможные случаи использования. Сериализатор работает не только в обычном Ruby, но и в JRuby, а также TruffleRuby.
Митапы
Ruby meetup №18
19:00
Рады сообщить, что у нас запланирован осенний Ruby Meetup. Все доклады будут традиционно предзаписаны в 4К, а вести митап в прямом эфире и помогать вам допрашивать спикеров в чате будет Григорий Петров, Ruby-разработчик и организатор конференции RubyRussia. Детальная информация о мероприятии будет опубликована позже, следите за нашими новостями.
Теперь следить за митапами Evrone стало удобнее. В Telegram-канале Evrone meetups мы выкладываем анонсы с подробными описаниями докладов, а также студийные записи после мероприятий. А ещё, у нас можно выступить, мы поможем оформить вашу экспертизу в яркое выступление. Подписывайтесь и пишите @andrew_aquariuss, чтобы узнать подробности.
Вакансии
Удаленка / Офис
Evrone
Мы открыты для новых Ruby-разработчиков. В Evrone можно работать удалённо с первого дня, мы поддерживаем и оплачиваем участие в Open-source проектах и выступления на конференциях, а расти в грейдах можно с помощью честной системы проверки навыков и менторства.