Точка бифуркации

05 сентября 2022
Точка бифуркации

В этом дайджесте поговорим о механизме FIFO для работы с очередями и посмотрим на альтернативу Puma. Также расскажем об инструменте для подготовки сериализованных данных и изменениях в тарифной политике Heroku.

Heroku меняется

TL;DR — халява закончилась. Бесплатные тарифные планы Heroku уходят в прошлое. Увы, но мошенничество и злоупотребление возможностями бесплатных тарифов стали основными драйверами грядущих изменений. Можно подумать, что расходы ресурсов на бесплатных тарифных планах стали аффектить других клиентов. Это сподвигло менеджмент на решительные действия.

Пользователям Heroku Dynos, Heroku Postgres и Heroku Data for Redis нужно учитывать, что их бесплатные тарифные планы перестанут действовать с 28 ноября 2022. Стоимость Heroku Dynos составит от $7 в месяц, Heroku Postgres от $9 в месяц и Heroku Data for Redis от $15 в месяц. Также с 26 октября 2022 начнётся большая чистка от неактивных аккаунтов.

Кое-что останется — команда Heroku продолжит поддержку студенческой программы Dreamforce и проектов с открытым исходным кодом. Подробности доступны в открытом интерактивном роадмапе.

Сериализация с Shale

Нет повести печальнее на свете, чем прямая работа с форматами сериализации в Ruby. Даже простые операции, например с XML, будут монструозными, а сложность кода возрастёт экспоненциально.

Выход — конвертация в объекты и обратная конвертация в нужный формат. Рекомендуем взять на вооружение gem Shale. Он из коробки умеет JSON и YAML, а при подключении соответствующих надстроек начинает работать с TOML или XML.

Сравните два примера, взятых из официальной документации. Первый — прямая работа с XML через nokogiri:

require 'nokogiri'

doc = Nokogiri::XML(<<~XML)
  <person></person>
XML

address = Nokogiri::XML::Node.new('address', doc)

street = Nokogiri::XML::Node.new('street', doc)
street.content = 'Oxford Street'
address.add_child(street)


city = Nokogiri::XML::Node.new('city', doc)
city.content = 'London'
address.add_child(city)

doc.root.add_child(address)
puts doc.to_xml

Второй пример — тоже самое, только через Shale:

require 'shale'

class Address < Shale::Mapper
  attribute :street, Shale::Type::String
  attribute :city, Shale::Type::String
end

class Person < Shale::Mapper
  attribute :address, Address
end

person = Person.from_xml('<person></person>')
person.address = Address.new(street: 'Oxford Street', city: 'London')

puts person.to_xml

 

Очевидно, что с ростом сложности первый пример разбухнет и станет слабочитаемым. Второй же останется простым и доступным для понимания.

FIFO в Ruby

Теоритически использование нескольких процессов — логичный и удобный приём асинхронного программирования. На практике возникают вопросы взаимодействия, так что хорошо бы знать, как организовано управление процессами и каким образом поддерживается связь между ними.

«Кто первый встал, того и тапки» — эта поговорка объясняет способ управления данными FIFO (First in, First Out). Он используется при обработке такой фундаментальной структуры данных, как очереди. Первый элемент поступивший в очередь будет обработан в первую очередь. Последующие элементы будут добавлены в конец очереди и обслуживаться итерационно.

Очереди удобно применять, чтобы рулить процессами, используя файл fifo. Загляните в статью «Multiprocessing communication with FIFO queues» где показано, как построить очередь из нескольких дочерних процессов и что делать для обработки ошибок.

Мощь тероподов

8 из 10 рубистов используют Puma  в качестве сервера приложений. У него много преимуществ, начиная от высокой скорости работы и заканчивая параллелизмом. Он взял лучшее от старичка Mongrel и с 2015 года официально рекомендуется Heroku в качестве основного веб-сервера для Ruby.

Но есть и альтернатива — Phusion Passenger 5 под кодовым именем Raptor. Проект не столь популярный, но также обладающий интересными возможностями. Он существует как в виде open source, так и в виде enterprise редакции.

Разработчики заявляют о том, что их веб-сервер в 4 раза быстрее, чем Unicorn, взятый за эталон. Он написан на С++ и используется в Apple, Pixar, New York Times, AirBnB, Juniper и так далее. Встроенный механизм кэширования отлично оптимизирован, так что не придётся ковыряться с настройкой memcached или Redis.

Сильная сторона Passenger — документация и гайды. В них можно найти много полезной информации и конфигурационные скрипты для настройки. Доступны интеграции с Nginx/Apache. Также его можно использовать в виде Standalone-приложения.

Митапы и конференции

Онлайн

Ruby Russia

Программа уже доступна на официальном сайте — регистрируйтесь и присоединяйтесь к нашей онлайн-конференции 30 сентября и 1 октября.

Полторы тысячи коллег-рубистов, заранее отснятые в студии доклады кинематографического качества и прямой эфир из Сколково: всё, чтобы собраться и обсудить интересующие вас темы из мира Ruby разработки!

Регистрация

 

Онлайн

Ruby meetup №18

 19:00

Рады сообщить, что у нас запланирован Ruby Meetup, который пройдёт 14 сентября 2022. Все доклады будут традиционно предзаписаны в 4К, а вести митап в прямом эфире и помогать вам допрашивать спикеров в чате будет Григорий Петров, Ruby-разработчик и организатор конференции RubyRussia. 

Детальная информация о мероприятии будет опубликована позже, следите за нашими новостями. Кстати, если у вас есть идея доклада и вы хотите стать спикером, то пишите на почту andy@evrone.com.

Регистрация

Вакансии

Удаленка / Офис

Evrone 

Мы открыты для новых Ruby-разработчиков. В Evrone можно работать удалённо с первого дня, мы поддерживаем и оплачиваем участие в Open-source проектах и выступления на конференциях, а расти в грейдах можно с помощью честной системы проверки навыков и менторства.

Подробнее

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