Going to extreme

  • 502 views
Uploaded on

 

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
502
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
0
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Впадая в крайности Решаем проблемы с Ruby on Rails http://www.slideshare.net/sergeymoiseev/going-to-extremeMonday, February 25, 13
  • 2. О докладчике • http://www.linkedin.com/in/moiseevsergey • https://github.com/bopm • http://www.slideshare.net/sergeymoiseev • @SergeyMoiseevMonday, February 25, 13
  • 3. В прошлых сериях • https://vimeo.com/51198953 • http://www.slideshare.net/sergeymoiseev/ migrate-4843818Monday, February 25, 13
  • 4. Тема доклада • Боль, давление, рельсы. • Временной интервал 2011 год. • Один из трех крупнейших купонных сервисов в РФ.Monday, February 25, 13
  • 5. Начинаем • У нас тут есть Drupal, что бы ты мог нам предложить. • Его пилят свои люди, но мы не можем себе позволить больше ждать. • Пилят уже почти год. • Админа у нас нет, но тут вроде был ДДоС.Monday, February 25, 13
  • 6. Январь 2011 года.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-StrategiesMonday, 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
  • 21. На дворе лето.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 endMonday, February 25, 13
  • 28. Миграция данных 3 • Пишем логику переноса в worker’ах. • При логике одна задача - один пользователь выполнение слабо параллелится.Monday, February 25, 13
  • 29. Nginx • Один из лучших веб-серверов. Четко ложится в наши планы по развертыванию. • Кеширует статику на фронтовых серверах. • Балансирует запросы на бековые unicorn’ы. • Миграция между площадками: апдейтим dns, указав в nginx proxy_pass на новое место.Monday, February 25, 13
  • 30. Monday, February 25, 13
  • 31. Unicorn • Hot restart. • Долгие споры с DevOps на тему unix socket (~5-10% прироста производительности) и числа процессов на ядро.Monday, February 25, 13
  • 32. Кнопки как у apple • Дизайн будет делать наш человек. • Ему и нам не интересно, что программисты думают о том, что дизайн не совместим с функционалом. • В переписке начинает вестись практика ответа всем кроме меня. • Приходится по каждому случаю показывать, что это не работает потому как функционал блокируется дизайном.Monday, February 25, 13
  • 33. На дворе зима.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
  • 52. P.S.Monday, February 25, 13
  • 53. Благодарности • Андрею, Антону, Лёше, Антону, Степану, Петру, Толе, Сергею, Леониду, Диме и Саше за то, что мы сделали вместе. • Джасуру, Шавкату, Комилу и Беку за бесценный опыт и то, что теперь я могу всё.Monday, February 25, 13
  • 54. Другой взгляд на события • http://www.slideshare.net/alexclear/ ruby-13262249 • Наш DevOps.Monday, February 25, 13