Первые дни
В первые дни мы построили Эйрколл с одним приложением Ruby on Rails. Использование Rails было отличным, потому что мы смогли загрузить процесс разработки. Кроме того, это помогло нам сосредоточиться на повторении, пока мы не приземлились на рыночную подгонку. Хотя, когда мы росли, стало ясно, что это приложение становилось слишком большим, поэтому мы разделили его на четыре приложения Ruby on Rails.
Первое из четырех приложений содержала большую часть продукта, например, учетные записи пользователей, настройки номеров и как внутренний/публичный API. Вторая содержала всю логику, используемую для подключения воздушного экрана к пользовательским интеграциям, таким как Salesforce и Zendesk. Третий обрабатывал всю логику вызовов в реальном времени, такую как маршрутизация и конференции. Наконец, четвертый обращался со всеми задачами, связанными с выставлением счетов, такими как обработка платежей и создание счетов.
Хотя это помогло нашей инженерной команде управлять различными частями продукта более организованным образом, основное приложение, содержащее большую часть продукта, продолжало расти. Кроме того, мы использовали AWS Elastic Beanstalk для размещения этих приложений, так как это позволило нам построить нашу инфраструктуру и быстро обслуживать наших клиентов, но впоследствии окажется главной болезнью в нашем трубопроводе CI.
В настоящее время
Перенесемся на несколько коротких лет, у нас теперь быстро растущая команда инженеров с тщательно продуманным парком контейнерных микросервисов. При этом, в основе всего этого остается наше самое первое приложение Ruby on Rails. Конечно, ответственность за это приложение значительно снизилась за эти годы, но она все еще выполняет важную роль в рамках нашей компании, являющейся единственным источником истины для большинства наших данных.
Во втором квартале 2019 года мы решили показать небольшую любовь к этому приложению, которое до конца этого поста мы позвоним Интернет Анкет Интернет управлял Rails 4.2 на Elastic Beanstalk. Rails 6 были на горизонте, и многие из наших других приложений уже работали в контейнерах Docker на ECS, поэтому было логично обновлять Web на более новую версию Rails и контейрировать ее. Хотя этот процесс намного легче сказать, чем сделать, нам удалось достичь этого всего за одну квартал.
Модернизация рельсов с 4,2 до 5,2
Это был второй по последний день Rails Conf 2019, когда я сидел в разговоре, введенном Эйлин М. Учитель, инженером -программистом в Github и членом команды Core Rails. Ее разговор подчеркнул, как Github удалось обновить и Ruby, и Rails. Если им удалось обновиться с Rails 2,3 до 5.2 и бросить свою индивидуальную вилку Ruby, сохраняя время безотказной работы, почему мы не можем сделать то же самое? Я имею в виду, что мы переходили только с 4,2 до 5,2, так что это должен быть кусок торта. Я был неправ. Вот что мы узнали и как мы это сделали.
Мы решили, что те, кто управлял обновлением Rails, будут постоянно объединяться Мастер в feat/repgrade-rails ветвь и задним числом исправляют любые проблемы с терапий по мере продвижения. Этот процесс оставил нас с нашим Мастер БЛИЧНЯЯ РЕВАРСКИЕ РЕВАС 4.2 и А feat/rails БЛАГОВОЕ РЕВОСС 5.2. Затем появилась забавная часть, исправляя все предупреждения об ископке, и, поскольку мы отправились прямо на Rails 5.2, они были в основном исключениями, а не предупреждениями.
Стоит отметить, что не рекомендуется пропускать версии и предлагается сначала начинать с 5.0, затем 5.1 и, наконец, 5.2. В конечном счете, мы решили прыгнуть прямо на 5.2, потому что это поможет нам быстрее курить проблемы с тестированием и избавило нас от необходимости очистки журналов тестирования для предупреждений об испаке.
Есть много изменений с рельсов 4.2 до 5,2, некоторые разрывы, а некоторые нет. Ниже приведены те, которые мы считаем наиболее важными, и шаги, необходимые для обновления
Рубин
Рейлс 5 требует минимума Ruby 2.2.2 или более поздней версии. Если вы используете RVM
, rbenv
, или ASDF
, это должно быть так же просто, как запуск следующих команд из вашей оболочки.
rvm install 2.2.2 rbenv install 2.2.2 asdf install ruby 2.2.2
Зависимости
Зависимости в вашем Gemfile могут быть не совместимы с более новыми версиями рельсов. Я предлагаю заблокировать вашу версию Rails в вашем Gemfile в более новой версии: Gem 'Rails', '~> 5.2'
. Затем запустить ОБНОВЛЕНИЕ ПУНКА в то время как постепенно натыкаясь на противоречивые драгоценные камни, пока не получите успешный пакет.
Конфигурация
После того, как вы достигли успешного пакета, запустите Rails App: обновление
Для интерактивного обновления файлов конфигурации в бин/
и /config
.
Схема
Уникальные и иностранные индексы сейчас живут внутри create_table
метод Бег Rails DB: мигрировать
генерирует новый db/schema.rb
Файл с этими изменениями независимо от того, есть ли у вас какие -либо ожидающие миграции.
Миграция
Activerecord
Файлы миграции должны быть помечены версией рельсов, в которой они были сгенерированы. CreateCalls
CreateCalls
class CreateCalls < ActiveRecord::Migration[4.2] def change end end
ActionController
Сильные параметры заменили защищенные атрибуты. Если вы уже использовали сильные параметры, то это не должно вызывать проблем. Важно отметить ActionController:: Параметры
Теперь возвращает Объект
вместо Хэш
Анкет
Чтобы получить доступ к необработанным параметрам как Хэш
, вы можете добавить #TO_H
к Объект
: params.to_h
Анкет
params.permit(:page, :per_page).to_h.reverse_merge(page: 1, per_page: 15)
Activerecord
Activerecord
Модели теперь наследуют от ApplicationRecord
вместо Activerecord:: Base
Анкет
# app/models/application_record.rb class ApplicationRecord < ActiveRecord::Base self.abstract_class = true end # app/models/call.rb class Call < ApplicationRecord belongs_to :number end
принадлежит_to
Ассоциации обязаны по умолчанию, и использование Требуется: true
в принадлежности_TO: Компания, Требуется: TRUE
теперь был заменен Необязательно: ложь
Анкет
# app/models/call.rb class Call < ApplicationRecord belongs_to :number, optional: false end
Activerecord
и ActiveModel
обратные вызовы больше не останавливаются при возвращении ЛОЖЬ
. Вам нужно использовать бросить (: прервать)
вместо.
class Number < ApplicationRecord before_create do throw(:abort) if you_need_to_stop_creation end end
Тесты
ActionController:: testcase
Теперь принимает только аргументы ключевых слов. Внутри ваши характеристики, get: show, id: 1
становится get: show, params: {id: 1}
Анкет
Что не сработало?
Тесты
Как уже упоминалось, веб -сайт существует некоторое время, и многие руки тронули его на протяжении многих лет. В любой кодовой базе все может выйти из -под контроля, и мы знали, что некоторые детали могут не иметь обширных испытаний. Это отсутствие тестов вызвало некоторые проблемы, потому что, как только мы получили существующий Spec Suite Green, мы все равно знали, что некоторые вещи могут не работать в результате обновления.
На этом этапе у нас было два решения. Во -первых, вручную тестировать продукт и попытаться воспроизвести любые краевые случаи, которые пришли на ум. Во -вторых, развертывание модернизированного приложения только до процента от нашего производственного трафика и быстро действий для исправления проблем. Тестирование дыма таким образом не было идеальной ситуацией, но это сработало для нас и сохранило время работы на уровне 99,99%.
Чтобы это не произошло в будущем, мы подчеркнули важность охвата кода в нашей инженерной команде. Simplecov Отлично подходит для этого и в настоящее время является частью нашего конвейера CI, рассчитывая испытательный охват для каждой ветви веб -сайта, плавно. В ближайшие недели я выпущу сообщение в блоге, показывающее, как мы собираем покрытие кода по нескольким ядрам процессоров и контейнерам на Circleci, чтобы создать один отчет.
Коммуникация
Помимо тестирования, связь имеет важное значение при выполнении миграции этой шкалы. Подводя итог, общение было хорошим, не очень здорово. Мы многонациональная команда инженеров с 10 инженерами в Нью -Йорке и 50 в Париже. Оглядываясь назад, проект такого масштаба лучше подходит для команды с наибольшим количеством инженеров, но вместо этого команда Нью -Йорка справилась с ним, учитывая доступность ресурсов в то время.
Неспособность общения стала очевидной, поскольку команда Парижа уйдет на день, пока команда Нью -Йорка прибудет и энергично работает над обновлением. Вскоре после этого, когда команда Нью -Йорка вернулась домой, команда Парижа вернутся на следующий день и иногда сталкивается с нестабильной ставкой. Поскольку веб -сайт лежит в основе нашей экосистемы, нестабильная среда препятствовала разработке некоторых проектов. В большинстве случаев нестабильные части были те, в которых не было никаких тестов. Вы могли бы сказать, что это было полезно, потому что это позволило нам определить проблемы, прежде чем они достигли наших клиентов. В то же время команда Парижа не была знакома с процедурами или статусом обновления, и часто приходилось устранять устранение неполадок в темноте, пока не прибыла команда Нью -Йорка. Что еще хуже, в некоторых случаях команда Парижа не знала, связана ли проблема с их проектом или обновлением Интернета.
Это обновление быстро указывало на область, в которой нам нужно было улучшить как команда. Кроме того, мы думаем, что при проведении обновления этой шкалы вам необходимо убедиться, что все инженерные команды находятся на каждом аспекте, независимо от местоположения или воспринимаемых взаимодействий.
Вывод
В целом, этот проект был успешным. Наш Legacy Monolith теперь готов пробежать еще несколько лет, пока мы продолжаем расти. Мы многому научились и продолжаем применять наши выводы к каждому новому проекту здесь, на эфире. Это обновление было нелегко, но оно того стоило. Теперь мы можем лучше обслуживать наших клиентов, выпустив новые функции и исправления ошибок быстрее, чем когда -либо, благодаря нашему улучшению конвейера CI.
Оригинал: «https://dev.to/cristian/how-did-we-upgrade-and-containerize-our-largest-rails-monolith-in-one-quarter-part-1-3mki»