1. Впадая в крайности
Решаем проблемы с Ruby on Rails
http://www.slideshare.net/sergeymoiseev/going-to-extreme
Monday, February 25, 13
2. О докладчике
• http://www.linkedin.com/in/moiseevsergey
• https://github.com/bopm
• http://www.slideshare.net/sergeymoiseev
• @SergeyMoiseev
Monday, February 25, 13
3. В прошлых сериях
• https://vimeo.com/51198953
• http://www.slideshare.net/sergeymoiseev/
migrate-4843818
Monday, February 25, 13
4. Тема доклада
• Боль, давление, рельсы.
• Временной интервал 2011 год.
• Один из трех крупнейших купонных
сервисов в РФ.
Monday, February 25, 13
5. Начинаем
• У нас тут есть Drupal, что бы ты мог нам
предложить.
• Его пилят свои люди, но мы не можем
себе позволить больше ждать.
• Пилят уже почти год.
• Админа у нас нет, но тут вроде был ДДоС.
Monday, February 25, 13
7. План действий
• Пишем новую версию на RoR.
• Мигрируем и начинаем развивать
функционал.
• Изначальная команда для разработки
нового проекта - три человека.
• Одного привел, второго забрал из под
увольнения.
Monday, February 25, 13
8. Пишем ТЗ
• Пишем ТЗ на базе текущей системы.
• Всё на месте? Вроде да.
• Окей, будем строить на базе гипотезы, что
заказчик читал ТЗ внимательно.
• Вместе с воспроизведением
функциональности будем делать редизайн.
Monday, February 25, 13
9. Первая итерация:
прототип
• Сделки, пользователи, покупки, регистрация.
• Дизайн.
• В процессе его разработки увольняется
делавший его дизайнер.
• Придумываем сами.
• Раз нет дизайна, то нет и формально
поставленной задачи.
Monday, February 25, 13
10. Postgresql
• Нет извечного конфликта какой storage
engine выбрать.
• Лучше тюнится.
• Я умею его готовить.
Monday, February 25, 13
11. Devise
• Гибкое решение по аунтефикации для
Rails.
• Очень эффективно для быстрого начала
разработки.
• Крайне гибкое и расширяемое.
• Из минусов: написано хакерами. Излучает
магию.
devise_for :users, :controllers => {:omniauth_callbacks =>
'users/omniauth_callbacks'}
Monday, February 25, 13
12. OmniAuth
• Поддержка множества провайдеров
аунтефикации.
• Поддерживает из коробки twitter,
facebook, гугл и множество других OAuth
провайдеров.
• Полный список: https://github.com/intridea/
omniauth/wiki/List-of-Strategies
Monday, February 25, 13
13. Globalize3
• Поддержка i18n на уровне базы.
• Перевод атрибутов моделей во вспомогательных
таблицах.
• Большой минус тесное связывание миграции и моделей.
Создаем: Используем:
class CreatePosts < ActiveRecord::Migration class Post < ActiveRecord::Base
def up translates :title, :text
create_table :posts do |t| end
t.timestamps
end
Post.create_translation_table! :title
=> :string, :text => :text
end Получаем:
def down I18n.locale = :en
drop_table :posts post.title # => Globalize3 rocks!
Post.drop_translation_table!
end I18n.locale = :he
end post.title # => !גלובאלייז2 שולט
Monday, February 25, 13
14. Seed-fu
• Заполнение справочников в БД.
• Позволяет вам писать сиды, которые
могут быть отредактированы, дополнены
и перезапущены путем ручного выбора
присваеваемых в базе ID.
Locale.delete_all
Locale.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
15. Смена курса
• Заказчик меняет ген. дира.
• Бывшего представителем заказчика на
проекте.
• На месте одного заказчика - четверо.
Monday, February 25, 13
16. Старая версия
• Нет VCS.
• Правят прямо на сервере.
• Наощупь.
• Свои люди доступны в офисе не в полном
объеме, живут в одной из среднеазиатских
республик.
• И да, они подчины только заказчику.
Monday, February 25, 13
17. Технологии старой
версии
• Один виртуальный сервер.
• Который админят индусы.
• MySQL из коробки.
• MyISAM.
Monday, February 25, 13
18. Самое интересное
• Заказчики не ведут формальную постановку задач
при работе со старой командой.
• Как потом окажется игнорируют постановку
задач вообще.
• Старая команда в свою очередь игнорирует
часть задач в принципе.
• Каждый день в референсной системе появляется
что-то новое.
• О чем нам забыли сказать.
Monday, February 25, 13
19. Ищем выход
• С тонущей подводной лодки.
• Плюсы: у нас рельсы и написаный
прототип.
• Минусы: нам нужно переломить кучу
бизнес-процессов притом быстро.
• Выбираем жертву: региональное зеркало.
• Спасительное но: данные независимы.
Monday, February 25, 13
20. Одновременно с этим
• Спасаем вселенную в лице старого проекта каждый
день (смотри доклад DevOps).
• Трафик на проекте постоянно растет.
• Боремся с ростом штата конторы с 20 до 150 человек.
• Внедряем VoIP.
• Перевозим офис на новое место за одну ночь (среды).
• Покупаем хостинг у RackSpace.
• Пишем новый массовый рассыльщик.
Monday, February 25, 13
22. Миграция данных
• Главный источник проблем.
• Особенно когда база меняется без учета
изменений.
• К примеру с помощью миграций в рельсах.
• В старой базе много данных относящихся к
коду которого уже нет в системе.
• А то никогда и не было.
Monday, February 25, 13
23. Мигрируем
региональное зеркало
• Начинаем в 20:00, заканчиваем к 02:30.
• Главная беда - долгая миграция данных.
• Даем себе обещание переносить максимум
данных заранее.
• На следующее утро узнаем, что заказчик не
предупредил региональных менеджеров.
• Все оставшееся время до конца года ругаемся
с ними в почте про “верните все обратно”.
Monday, February 25, 13
24. Проводим очередную
демонстрацию заказчику
• В таком дизайне это внедрять нельзя.
• Не важно, что мы это видели и согласилсь
запускать в регионы.
• Будем делать новый дизайн.
• С кнопками как у Apple.
Monday, February 25, 13
25. Нам нужны люди
побольше
• Заказчик настаивает на наращивании штата.
• Организует собеседования через HR.
• Плюс четыре человека в штат
программистов.
• Все требуют время на себя.
• Если вы не успеваете что-то, нужен PM в
штат.
Monday, February 25, 13
26. Миграция данных 2
• Выделяем постоянного специалиста.
• Теперь уже на основном объеме данных.
• Все прошлые проблемы плюс:
• больший объем данных;
• больше спрятанного под ковер.
Monday, February 25, 13
27. Resque
• Решение по созданию фоновых очередей.
• Поддерживает множественные очереди
на базе Redis.
Worker: Запуск:
class Archive class Repository
@queue = :file_serve def async_create_archive(branch)
Resque.enqueue(Archive, self.id, branch)
def self.perform(repo_id, branch = 'master') end
repo = Repository.find(repo_id) end
repo.create_archive(branch)
end
end
Monday, February 25, 13
28. Миграция данных 3
• Пишем логику переноса в worker’ах.
• При логике одна задача - один
пользователь выполнение слабо
параллелится.
Monday, February 25, 13
29. Nginx
• Один из лучших веб-серверов. Четко
ложится в наши планы по развертыванию.
• Кеширует статику на фронтовых серверах.
• Балансирует запросы на бековые
unicorn’ы.
• Миграция между площадками: апдейтим
dns, указав в nginx proxy_pass на новое
место.
Monday, February 25, 13
31. Unicorn
• Hot restart.
• Долгие споры с DevOps на тему unix
socket (~5-10% прироста
производительности) и числа процессов
на ядро.
Monday, February 25, 13
32. Кнопки как у apple
• Дизайн будет делать наш человек.
• Ему и нам не интересно, что программисты
думают о том, что дизайн не совместим с
функционалом.
• В переписке начинает вестись практика ответа
всем кроме меня.
• Приходится по каждому случаю показывать,
что это не работает потому как функционал
блокируется дизайном.
Monday, February 25, 13
34. Кнопки как у Apple 2
• Свой человек уходит.
• Как и в прошлый раз продолжаем делать
своими силами.
• Но это сильно что-то напоминает.
Monday, February 25, 13
35. Коммунистический
субботник
• Выгоднее всего работать по ночам.
• По вечерам есть время чтобы успевать делать
все накопившееся и еще чуть-чуть.
• Несмотря на это придумываются “блокеры”
которые нужно сделать до запуска.
• Команда работает без выходных на
регулярной основе.
• Но не вся. Новички не понимают чем обязаны.
Monday, February 25, 13
36. Decision Point
• На дворе конец ноября.
• Если не запустить проект сейчас, то не
понятно когда его вообще запускать.
Monday, February 25, 13
37. Запуск
• Ночь с пятницы на понедельник.
• Нагрузка на запущенных ранее зеркалах и основном
сайте не сравнима.
• Виртуальная машина дает просадку производительности.
• Вынимаем из нее бекэнд.
• Это не помогает. Бекэнды не успевают отвечать и
наружу падают 504.
• Посещения падают к 4-5 утра и все кто выжил идут
спать.
Monday, February 25, 13
38. Запуск 2
• DevOps с бекграундом во всем вообще
очень полезный человек на проекте.
• Когда он не пишет вам в общекомандный
чат, что рубисты уроды и им мало руки
оторвать.
• В итоге помогает профилировать
приложение и говорит о просадке по GC.
Monday, February 25, 13
39. Запуск 3
• Ведущий разработчик высказывает версию
о том, что GC в ветке 1.9.x не должен так
втыкать.
• Быстро собираем 1.9.2 и стабилизируем
поток 504тых.
• К концу суток с момента начала работ по
запуску можно выдохнуть.
Monday, February 25, 13
40. Новая прекрасная
жизнь
• Все недовольны.
• Верните как было.
• Я не знаю как этим пользоваться.
• У нас не сходятся цифры.
• С начала жизни проекта.
Monday, February 25, 13
41. Миграция данных 4
• Все чистые данные на месте, но есть куча
проблемных.
• Остатки на счетах съедают нам мозги.
• Правим-перезапускаем-правим.
• Поздняя домиграция. Ставим
миграционный таск в очередь при
попытке логина.
Monday, February 25, 13
42. Деплой
• Больше всего времени съедает
перекомпиляция ресурсов.
• Сейчас для того же использую Turbo-
sprockets-rails3.
• Тогда в качестве process monitoring был
god, сейчас bluepill.
Monday, February 25, 13
43. Производительность
• Слишком интерактивная главная страница.
• Переписываем на статическую компоновку главной страницы
с выполнением операций показа скрытия акций по cron.
• Фрагментарное кеширование. Его никогда не бывает много.
• В итоге последние цифры которые я видел 150rps на
бекэнде. В рельсах.
• В начале года было 20rps на единственном сервере.
• Лендинги. Самое проблемное место в проекте. Нужно писать
тонны лидовых данных. Для пользователей которые еще не
пользователи. И могут ими не стать.
Monday, February 25, 13
44. Sinatra
• Младший брат RoR, фреймворк для создания
однофайловых веб-приложений.
• Создание лендинговых страниц без полного
инстанцирования модельного слоя.
• В целом гипотеза была ошибочной,
стабилизировать лендинги на синатре мы так и
не смогли.
• Говорят async_sinatra помогает, но пробовать
пока негде.
Monday, February 25, 13
45. О высоких нагрузках
• Вы стоите под очень толстой струей воды.
• Пока написанный вами код пропускает ее через
себя без задержки, вы ее не замечаете.
• Как только он начинает лагать, последовательно
наедается все.
• Кошмар заказчика - 504тые по всем фронтам.
• До тех пор пока в команде кто-то не понимает,
что он пишет, любой деплой - катастрофа.
Monday, February 25, 13
46. Климат
• http://issendai.livejournal.com/572510.html
• Хочешь привязать к себе людей, держи их
слишком занятыми чтобы думать.
• Все задачи идут мимо jira.
• Большинство противоречат друг-другу по
приоритетам.
• Релиз в начале декабря, к 20тым числам
проект стабилизирован.
Monday, February 25, 13
47. Климат 2
• Ведущий разработчик требует время на
стабилизацию проекта.
• Заказчик требует все переделать.
• Каждый день.
• Я беру отпуск по уходу за рассудком.
Monday, February 25, 13
48. Климат 3
• В отпуск мне сообщают, что я все
испортил.
• Что ничего не работает (команда говорит
обратное).
• Знакомые говорят, что их собеседуют на
моё место.
• Мне отменяют премию за запуск.
Monday, February 25, 13
49. Внутренние цели
• На протяжении всего года я говорил
себе, что взявшись за проект я не могу
позволить его бросить на середине.
• Начинает возникать понимание.
• Что проект закончен.
• Лучше чем сейчас мне его не сделать.
• А что терять - есть.
Monday, February 25, 13
50. Итог
• В первый рабочий день 2012 года я подаю
заявление об увольнении.
• В течении нескольких месяцев все
региональные зеркала переведены на
новый RoR движок.
• Команда постепенно увольняется.
• Заменяясь аутсорсерами.
Monday, February 25, 13
51. Выученные уроки
• Дизайн нельзя менять вместе с
платформой.
• Дизайн нельзя менять не понимая, что
продает.
• Рельсы позволяют соревноваться по
скорости с самым пытливым умом.
• Но не когда их четыре.
Monday, February 25, 13
53. Благодарности
• Андрею, Антону, Лёше, Антону, Степану,
Петру, Толе, Сергею, Леониду, Диме и
Саше за то, что мы сделали вместе.
• Джасуру, Шавкату, Комилу и Беку за
бесценный опыт и то, что теперь я могу
всё.
Monday, February 25, 13
54. Другой взгляд на
события
• http://www.slideshare.net/alexclear/
ruby-13262249
• Наш DevOps.
Monday, February 25, 13