54
Впадая в крайности Решаем проблемы с Ruby on Rails http://www.slideshare.net/sergeymoiseev/going-to-extreme Monday, February 25, 13

Going to extreme

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Going to extreme

Впадая в крайностиРешаем проблемы с Ruby on Rails

http://www.slideshare.net/sergeymoiseev/going-to-extreme

Monday, February 25, 13

Page 2: Going to extreme

О докладчике

• http://www.linkedin.com/in/moiseevsergey

• https://github.com/bopm

• http://www.slideshare.net/sergeymoiseev

• @SergeyMoiseev

Monday, February 25, 13

Page 4: Going to extreme

Тема доклада

• Боль, давление, рельсы.

• Временной интервал 2011 год.

• Один из трех крупнейших купонных сервисов в РФ.

Monday, February 25, 13

Page 5: Going to extreme

Начинаем

• У нас тут есть Drupal, что бы ты мог нам предложить.

• Его пилят свои люди, но мы не можем себе позволить больше ждать.

• Пилят уже почти год.• Админа у нас нет, но тут вроде был ДДоС.

Monday, February 25, 13

Page 6: Going to extreme

Январь 2011 года.

Monday, February 25, 13

Page 7: Going to extreme

План действий

• Пишем новую версию на RoR.

• Мигрируем и начинаем развивать функционал.

• Изначальная команда для разработки нового проекта - три человека.

• Одного привел, второго забрал из под увольнения.

Monday, February 25, 13

Page 8: Going to extreme

Пишем ТЗ

• Пишем ТЗ на базе текущей системы.

• Всё на месте? Вроде да.• Окей, будем строить на базе гипотезы, что заказчик читал ТЗ внимательно.

• Вместе с воспроизведением функциональности будем делать редизайн.

Monday, February 25, 13

Page 9: Going to extreme

Первая итерация: прототип

• Сделки, пользователи, покупки, регистрация.• Дизайн.• В процессе его разработки увольняется делавший его дизайнер.

• Придумываем сами.

• Раз нет дизайна, то нет и формально поставленной задачи.

Monday, February 25, 13

Page 10: Going to extreme

Postgresql

• Нет извечного конфликта какой storage engine выбрать.

• Лучше тюнится.• Я умею его готовить.

Monday, February 25, 13

Page 11: Going to extreme

Devise

• Гибкое решение по аунтефикации для Rails.

• Очень эффективно для быстрого начала разработки.

• Крайне гибкое и расширяемое.• Из минусов: написано хакерами. Излучает магию.

devise_for :users, :controllers => {:omniauth_callbacks => 'users/omniauth_callbacks'}

Monday, February 25, 13

Page 12: Going to extreme

OmniAuth

• Поддержка множества провайдеров аунтефикации.

• Поддерживает из коробки twitter, facebook, гугл и множество других OAuth провайдеров.

• Полный список: https://github.com/intridea/omniauth/wiki/List-of-Strategies

Monday, February 25, 13

Page 13: Going to extreme

Globalize3• Поддержка i18n на уровне базы.

• Перевод атрибутов моделей во вспомогательных таблицах.

• Большой минус тесное связывание миграции и моделей.

Используем:class Post < ActiveRecord::Base translates :title, :textend

Создаем:class CreatePosts < ActiveRecord::Migration def up create_table :posts do |t| t.timestamps end Post.create_translation_table! :title => :string, :text => :text end def down drop_table :posts Post.drop_translation_table! endend

Получаем:I18n.locale = :enpost.title # => Globalize3 rocks!

I18n.locale = :hepost.title # => גלובאלייז2 שולט!

Monday, February 25, 13

Page 14: Going to extreme

Seed-fu• Заполнение справочников в БД.

• Позволяет вам писать сиды, которые могут быть отредактированы, дополнены и перезапущены путем ручного выбора присваеваемых в базе ID.

Locale.delete_allLocale.seed(:id, {:id => 1, :code => 'ru' }, {:id => 2, :code => 'en' }, {:id => 3, :code => 'lv' }, {:id => 4, :code => 'lt' }, {:id => 5, :code => 'ee' },)

Monday, February 25, 13

Page 15: Going to extreme

Смена курса

• Заказчик меняет ген. дира.• Бывшего представителем заказчика на проекте.

• На месте одного заказчика - четверо.

Monday, February 25, 13

Page 16: Going to extreme

Старая версия

• Нет VCS.

• Правят прямо на сервере.• Наощупь.• Свои люди доступны в офисе не в полном объеме, живут в одной из среднеазиатских республик.

• И да, они подчины только заказчику.

Monday, February 25, 13

Page 17: Going to extreme

Технологии старой версии

• Один виртуальный сервер. • Который админят индусы.

• MySQL из коробки.

• MyISAM.

Monday, February 25, 13

Page 18: Going to extreme

Самое интересное

• Заказчики не ведут формальную постановку задач при работе со старой командой.

• Как потом окажется игнорируют постановку задач вообще.

• Старая команда в свою очередь игнорирует часть задач в принципе.

• Каждый день в референсной системе появляется что-то новое.

• О чем нам забыли сказать.

Monday, February 25, 13

Page 19: Going to extreme

Ищем выход

• С тонущей подводной лодки.

• Плюсы: у нас рельсы и написаный прототип.

• Минусы: нам нужно переломить кучу бизнес-процессов притом быстро.

• Выбираем жертву: региональное зеркало.

• Спасительное но: данные независимы.

Monday, February 25, 13

Page 20: Going to extreme

Одновременно с этим

• Спасаем вселенную в лице старого проекта каждый день (смотри доклад DevOps).

• Трафик на проекте постоянно растет.• Боремся с ростом штата конторы с 20 до 150 человек.

• Внедряем VoIP.

• Перевозим офис на новое место за одну ночь (среды).

• Покупаем хостинг у RackSpace.

• Пишем новый массовый рассыльщик.

Monday, February 25, 13

Page 21: Going to extreme

На дворе лето.

Monday, February 25, 13

Page 22: Going to extreme

Миграция данных

• Главный источник проблем.

• Особенно когда база меняется без учета изменений.

• К примеру с помощью миграций в рельсах.

• В старой базе много данных относящихся к коду которого уже нет в системе.

• А то никогда и не было.

Monday, February 25, 13

Page 23: Going to extreme

Мигрируем региональное зеркало • Начинаем в 20:00, заканчиваем к 02:30.

• Главная беда - долгая миграция данных. • Даем себе обещание переносить максимум данных заранее.

• На следующее утро узнаем, что заказчик не предупредил региональных менеджеров.

• Все оставшееся время до конца года ругаемся с ними в почте про “верните все обратно”.

Monday, February 25, 13

Page 24: Going to extreme

Проводим очередную демонстрацию заказчику

• В таком дизайне это внедрять нельзя.

• Не важно, что мы это видели и согласилсь запускать в регионы.

• Будем делать новый дизайн.

• С кнопками как у Apple.

Monday, February 25, 13

Page 25: Going to extreme

Нам нужны люди побольше

• Заказчик настаивает на наращивании штата.• Организует собеседования через HR.

• Плюс четыре человека в штат программистов.

• Все требуют время на себя.• Если вы не успеваете что-то, нужен PM в штат.

Monday, February 25, 13

Page 26: Going to extreme

Миграция данных 2

• Выделяем постоянного специалиста.

• Теперь уже на основном объеме данных.

• Все прошлые проблемы плюс:

• больший объем данных;

• больше спрятанного под ковер.

Monday, February 25, 13

Page 27: Going to extreme

Resque• Решение по созданию фоновых очередей.

• Поддерживает множественные очереди на базе Redis.

Worker:class Archive @queue = :file_serve

def self.perform(repo_id, branch = 'master') repo = Repository.find(repo_id) repo.create_archive(branch) endend

Запуск:class Repository def async_create_archive(branch) Resque.enqueue(Archive, self.id, branch) endend

Monday, February 25, 13

Page 28: Going to extreme

Миграция данных 3

• Пишем логику переноса в worker’ах.

• При логике одна задача - один пользователь выполнение слабо параллелится.

Monday, February 25, 13

Page 29: Going to extreme

Nginx

• Один из лучших веб-серверов. Четко ложится в наши планы по развертыванию.

• Кеширует статику на фронтовых серверах.• Балансирует запросы на бековые

unicorn’ы.

• Миграция между площадками: апдейтим dns, указав в nginx proxy_pass на новое место.

Monday, February 25, 13

Page 30: Going to extreme

Monday, February 25, 13

Page 31: Going to extreme

Unicorn

• Hot restart.

• Долгие споры с DevOps на тему unix socket (~5-10% прироста производительности) и числа процессов на ядро.

Monday, February 25, 13

Page 32: Going to extreme

Кнопки как у apple

• Дизайн будет делать наш человек.

• Ему и нам не интересно, что программисты думают о том, что дизайн не совместим с функционалом.

• В переписке начинает вестись практика ответа всем кроме меня.

• Приходится по каждому случаю показывать, что это не работает потому как функционал блокируется дизайном.

Monday, February 25, 13

Page 33: Going to extreme

На дворе зима.

Monday, February 25, 13

Page 34: Going to extreme

Кнопки как у Apple 2

• Свой человек уходит.• Как и в прошлый раз продолжаем делать своими силами.

• Но это сильно что-то напоминает.

Monday, February 25, 13

Page 35: Going to extreme

Коммунистический субботник

• Выгоднее всего работать по ночам.

• По вечерам есть время чтобы успевать делать все накопившееся и еще чуть-чуть.

• Несмотря на это придумываются “блокеры” которые нужно сделать до запуска.

• Команда работает без выходных на регулярной основе.

• Но не вся. Новички не понимают чем обязаны.

Monday, February 25, 13

Page 36: Going to extreme

Decision Point

• На дворе конец ноября.• Если не запустить проект сейчас, то не понятно когда его вообще запускать.

Monday, February 25, 13

Page 37: Going to extreme

Запуск

• Ночь с пятницы на понедельник.

• Нагрузка на запущенных ранее зеркалах и основном сайте не сравнима.

• Виртуальная машина дает просадку производительности.• Вынимаем из нее бекэнд.

• Это не помогает. Бекэнды не успевают отвечать и наружу падают 504.

• Посещения падают к 4-5 утра и все кто выжил идут спать.

Monday, February 25, 13

Page 38: Going to extreme

Запуск 2

• DevOps с бекграундом во всем вообще очень полезный человек на проекте.

• Когда он не пишет вам в общекомандный чат, что рубисты уроды и им мало руки оторвать.

• В итоге помогает профилировать приложение и говорит о просадке по GC.

Monday, February 25, 13

Page 39: Going to extreme

Запуск 3

• Ведущий разработчик высказывает версию о том, что GC в ветке 1.9.x не должен так втыкать.

• Быстро собираем 1.9.2 и стабилизируем поток 504тых.

• К концу суток с момента начала работ по запуску можно выдохнуть.

Monday, February 25, 13

Page 40: Going to extreme

Новая прекрасная жизнь

• Все недовольны.

• Верните как было.• Я не знаю как этим пользоваться.

• У нас не сходятся цифры.

• С начала жизни проекта.

Monday, February 25, 13

Page 41: Going to extreme

Миграция данных 4

• Все чистые данные на месте, но есть куча проблемных.

• Остатки на счетах съедают нам мозги.

• Правим-перезапускаем-правим.

• Поздняя домиграция. Ставим миграционный таск в очередь при попытке логина.

Monday, February 25, 13

Page 42: Going to extreme

Деплой

• Больше всего времени съедает перекомпиляция ресурсов.

• Сейчас для того же использую Turbo-sprockets-rails3.

• Тогда в качестве process monitoring был god, сейчас bluepill.

Monday, February 25, 13

Page 43: Going to extreme

Производительность

• Слишком интерактивная главная страница.

• Переписываем на статическую компоновку главной страницы с выполнением операций показа скрытия акций по cron.

• Фрагментарное кеширование. Его никогда не бывает много.

• В итоге последние цифры которые я видел 150rps на бекэнде. В рельсах.

• В начале года было 20rps на единственном сервере.

• Лендинги. Самое проблемное место в проекте. Нужно писать тонны лидовых данных. Для пользователей которые еще не пользователи. И могут ими не стать.

Monday, February 25, 13

Page 44: Going to extreme

Sinatra

• Младший брат RoR, фреймворк для создания однофайловых веб-приложений.

• Создание лендинговых страниц без полного инстанцирования модельного слоя.

• В целом гипотеза была ошибочной, стабилизировать лендинги на синатре мы так и не смогли.

• Говорят async_sinatra помогает, но пробовать пока негде.

Monday, February 25, 13

Page 45: Going to extreme

О высоких нагрузках

• Вы стоите под очень толстой струей воды.

• Пока написанный вами код пропускает ее через себя без задержки, вы ее не замечаете.

• Как только он начинает лагать, последовательно наедается все.

• Кошмар заказчика - 504тые по всем фронтам.

• До тех пор пока в команде кто-то не понимает, что он пишет, любой деплой - катастрофа.

Monday, February 25, 13

Page 46: Going to extreme

Климат

• http://issendai.livejournal.com/572510.html

• Хочешь привязать к себе людей, держи их слишком занятыми чтобы думать.

• Все задачи идут мимо jira.

• Большинство противоречат друг-другу по приоритетам.

• Релиз в начале декабря, к 20тым числам проект стабилизирован.

Monday, February 25, 13

Page 47: Going to extreme

Климат 2

• Ведущий разработчик требует время на стабилизацию проекта.

• Заказчик требует все переделать.• Каждый день.• Я беру отпуск по уходу за рассудком.

Monday, February 25, 13

Page 48: Going to extreme

Климат 3

• В отпуск мне сообщают, что я все испортил.

• Что ничего не работает (команда говорит обратное).

• Знакомые говорят, что их собеседуют на моё место.

• Мне отменяют премию за запуск.

Monday, February 25, 13

Page 49: Going to extreme

Внутренние цели

• На протяжении всего года я говорил себе, что взявшись за проект я не могу позволить его бросить на середине.

• Начинает возникать понимание.• Что проект закончен.• Лучше чем сейчас мне его не сделать.

• А что терять - есть.

Monday, February 25, 13

Page 50: Going to extreme

Итог

• В первый рабочий день 2012 года я подаю заявление об увольнении.

• В течении нескольких месяцев все региональные зеркала переведены на новый RoR движок.

• Команда постепенно увольняется.• Заменяясь аутсорсерами.

Monday, February 25, 13

Page 51: Going to extreme

Выученные уроки

• Дизайн нельзя менять вместе с платформой.

• Дизайн нельзя менять не понимая, что продает.

• Рельсы позволяют соревноваться по скорости с самым пытливым умом.

• Но не когда их четыре.

Monday, February 25, 13

Page 52: Going to extreme

P.S.

Monday, February 25, 13

Page 53: Going to extreme

Благодарности

• Андрею, Антону, Лёше, Антону, Степану, Петру, Толе, Сергею, Леониду, Диме и Саше за то, что мы сделали вместе.

• Джасуру, Шавкату, Комилу и Беку за бесценный опыт и то, что теперь я могу всё.

Monday, February 25, 13

Page 54: Going to extreme

Другой взгляд на события

• http://www.slideshare.net/alexclear/ruby-13262249

• Наш DevOps.

Monday, February 25, 13