Астрологи объявили неделю апдейтов

03 ноября 2022
Астрологи объявили неделю апдейтов

Следить за обновлениями нет времени? Не беда, мы в 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 проектах и выступления на конференциях, а расти в грейдах можно с помощью честной системы проверки навыков и менторства.

Подробнее

Подписаться
на Digest →
Важные новости и мероприятия без спама
Технологии которыми вы владеете и которые вам интересны
Ваш адрес электронной почты в безопасности - вот наша политика конфиденциальности.