Going to extreme
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Going to extreme

on

  • 765 views

 

Statistics

Views

Total Views
765
Views on SlideShare
765
Embed Views
0

Actions

Likes
0
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Going to extreme Presentation 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