SlideShare una empresa de Scribd logo
1 de 54
Descargar para leer sin conexión
Впадая в крайности
                           Решаем проблемы с Ruby on Rails




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


Monday, February 25, 13
О докладчике

               • http://www.linkedin.com/in/moiseevsergey
               • https://github.com/bopm
               • http://www.slideshare.net/sergeymoiseev
               • @SergeyMoiseev


Monday, February 25, 13
В прошлых сериях


               • https://vimeo.com/51198953
               • http://www.slideshare.net/sergeymoiseev/
                     migrate-4843818




Monday, February 25, 13
Тема доклада

               • Боль, давление, рельсы.
               • Временной интервал 2011 год.
               • Один из трех крупнейших купонных
                     сервисов в РФ.




Monday, February 25, 13
Начинаем

               • У нас тут есть Drupal, что бы ты мог нам
                     предложить.
               • Его пилят свои люди, но мы не можем
                     себе позволить больше ждать.
               • Пилят уже почти год.
               • Админа у нас нет, но тут вроде был ДДоС.

Monday, February 25, 13
Январь 2011 года.



Monday, February 25, 13
План действий
               • Пишем новую версию на RoR.
               • Мигрируем и начинаем развивать
                     функционал.
               • Изначальная команда для разработки
                     нового проекта - три человека.
                    • Одного привел, второго забрал из под
                          увольнения.


Monday, February 25, 13
Пишем ТЗ
               • Пишем ТЗ на базе текущей системы.
               • Всё на месте? Вроде да.
               • Окей, будем строить на базе гипотезы, что
                     заказчик читал ТЗ внимательно.
               • Вместе с воспроизведением
                     функциональности будем делать редизайн.



Monday, February 25, 13
Первая итерация:
                             прототип
               •     Сделки, пользователи, покупки, регистрация.
               •     Дизайн.
               •     В процессе его разработки увольняется
                     делавший его дизайнер.
               •     Придумываем сами.
               •     Раз нет дизайна, то нет и формально
                     поставленной задачи.


Monday, February 25, 13
Postgresql

               • Нет извечного конфликта какой storage
                     engine выбрать.
               • Лучше тюнится.
               • Я умею его готовить.


Monday, February 25, 13
Devise
               • Гибкое решение по аунтефикации для
                     Rails.
               • Очень эффективно для быстрого начала
                     разработки.
               • Крайне гибкое и расширяемое.
               • Из минусов: написано хакерами. Излучает
                     магию.
                 devise_for :users, :controllers => {:omniauth_callbacks =>
                 'users/omniauth_callbacks'}

Monday, February 25, 13
OmniAuth
               • Поддержка множества провайдеров
                     аунтефикации.
               • Поддерживает из коробки twitter,
                     facebook, гугл и множество других OAuth
                     провайдеров.
               • Полный список: https://github.com/intridea/
                     omniauth/wiki/List-of-Strategies



Monday, February 25, 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
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
Смена курса

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


Monday, February 25, 13
Старая версия
               • Нет VCS.
                • Правят прямо на сервере.
                • Наощупь.
               • Свои люди доступны в офисе не в полном
                     объеме, живут в одной из среднеазиатских
                     республик.
               • И да, они подчины только заказчику.
Monday, February 25, 13
Технологии старой
                           версии

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


Monday, February 25, 13
Самое интересное
               •     Заказчики не ведут формальную постановку задач
                     при работе со старой командой.
                    •     Как потом окажется игнорируют постановку
                          задач вообще.
               •     Старая команда в свою очередь игнорирует
                     часть задач в принципе.
               •     Каждый день в референсной системе появляется
                     что-то новое.
                    •     О чем нам забыли сказать.


Monday, February 25, 13
Ищем выход
               • С тонущей подводной лодки.
               • Плюсы: у нас рельсы и написаный
                     прототип.
               • Минусы: нам нужно переломить кучу
                     бизнес-процессов притом быстро.
               • Выбираем жертву: региональное зеркало.
               • Спасительное но: данные независимы.
Monday, February 25, 13
Одновременно с этим
               •     Спасаем вселенную в лице старого проекта каждый
                     день (смотри доклад DevOps).
               •     Трафик на проекте постоянно растет.
               •     Боремся с ростом штата конторы с 20 до 150 человек.
               •     Внедряем VoIP.
               •     Перевозим офис на новое место за одну ночь (среды).
               •     Покупаем хостинг у RackSpace.
               •     Пишем новый массовый рассыльщик.



Monday, February 25, 13
На дворе лето.




Monday, February 25, 13
Миграция данных
               •     Главный источник проблем.
               •     Особенно когда база меняется без учета
                     изменений.
                    •     К примеру с помощью миграций в рельсах.
               •     В старой базе много данных относящихся к
                     коду которого уже нет в системе.
                    •     А то никогда и не было.


Monday, February 25, 13
Мигрируем
                 региональное зеркало
               •     Начинаем в 20:00, заканчиваем к 02:30.
               •     Главная беда - долгая миграция данных.
               •     Даем себе обещание переносить максимум
                     данных заранее.
               •     На следующее утро узнаем, что заказчик не
                     предупредил региональных менеджеров.
               •     Все оставшееся время до конца года ругаемся
                     с ними в почте про “верните все обратно”.


Monday, February 25, 13
Проводим очередную
            демонстрацию заказчику
               • В таком дизайне это внедрять нельзя.
               • Не важно, что мы это видели и согласилсь
                     запускать в регионы.
               • Будем делать новый дизайн.
               • С кнопками как у Apple.

Monday, February 25, 13
Нам нужны люди
                             побольше
               • Заказчик настаивает на наращивании штата.
               • Организует собеседования через HR.
               • Плюс четыре человека в штат
                     программистов.
               • Все требуют время на себя.
               • Если вы не успеваете что-то, нужен PM в
                     штат.


Monday, February 25, 13
Миграция данных 2

               • Выделяем постоянного специалиста.
               • Теперь уже на основном объеме данных.
               • Все прошлые проблемы плюс:
                • больший объем данных;
                • больше спрятанного под ковер.

Monday, February 25, 13
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
Миграция данных 3

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




Monday, February 25, 13
Nginx
               • Один из лучших веб-серверов. Четко
                     ложится в наши планы по развертыванию.
               • Кеширует статику на фронтовых серверах.
               • Балансирует запросы на бековые
                     unicorn’ы.
               • Миграция между площадками: апдейтим
                     dns, указав в nginx proxy_pass на новое
                     место.


Monday, February 25, 13
Monday, February 25, 13
Unicorn

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




Monday, February 25, 13
Кнопки как у apple
               •     Дизайн будет делать наш человек.
               •     Ему и нам не интересно, что программисты
                     думают о том, что дизайн не совместим с
                     функционалом.
               •     В переписке начинает вестись практика ответа
                     всем кроме меня.
               •     Приходится по каждому случаю показывать,
                     что это не работает потому как функционал
                     блокируется дизайном.


Monday, February 25, 13
На дворе зима.



Monday, February 25, 13
Кнопки как у Apple 2

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


Monday, February 25, 13
Коммунистический
                             субботник
               •     Выгоднее всего работать по ночам.
               •     По вечерам есть время чтобы успевать делать
                     все накопившееся и еще чуть-чуть.
               •     Несмотря на это придумываются “блокеры”
                     которые нужно сделать до запуска.
               •     Команда работает без выходных на
                     регулярной основе.
               •     Но не вся. Новички не понимают чем обязаны.


Monday, February 25, 13
Decision Point


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




Monday, February 25, 13
Запуск
               •     Ночь с пятницы на понедельник.
               •     Нагрузка на запущенных ранее зеркалах и основном
                     сайте не сравнима.
               •     Виртуальная машина дает просадку производительности.
               •     Вынимаем из нее бекэнд.
               •     Это не помогает. Бекэнды не успевают отвечать и
                     наружу падают 504.
               •     Посещения падают к 4-5 утра и все кто выжил идут
                     спать.



Monday, February 25, 13
Запуск 2
               • DevOps с бекграундом во всем вообще
                     очень полезный человек на проекте.
               • Когда он не пишет вам в общекомандный
                     чат, что рубисты уроды и им мало руки
                     оторвать.
               • В итоге помогает профилировать
                     приложение и говорит о просадке по GC.



Monday, February 25, 13
Запуск 3
               • Ведущий разработчик высказывает версию
                     о том, что GC в ветке 1.9.x не должен так
                     втыкать.
               • Быстро собираем 1.9.2 и стабилизируем
                     поток 504тых.
               • К концу суток с момента начала работ по
                     запуску можно выдохнуть.



Monday, February 25, 13
Новая прекрасная
                               жизнь
               • Все недовольны.
               • Верните как было.
               • Я не знаю как этим пользоваться.
               • У нас не сходятся цифры.
                • С начала жизни проекта.

Monday, February 25, 13
Миграция данных 4
               • Все чистые данные на месте, но есть куча
                     проблемных.
                    • Остатки на счетах съедают нам мозги.
               • Правим-перезапускаем-правим.
               • Поздняя домиграция. Ставим
                     миграционный таск в очередь при
                     попытке логина.


Monday, February 25, 13
Деплой

               • Больше всего времени съедает
                     перекомпиляция ресурсов.
               • Сейчас для того же использую Turbo-
                     sprockets-rails3.
               • Тогда в качестве process monitoring был
                     god, сейчас bluepill.



Monday, February 25, 13
Производительность
               •     Слишком интерактивная главная страница.
               •     Переписываем на статическую компоновку главной страницы
                     с выполнением операций показа скрытия акций по cron.
               •     Фрагментарное кеширование. Его никогда не бывает много.
               •     В итоге последние цифры которые я видел 150rps на
                     бекэнде. В рельсах.
               •     В начале года было 20rps на единственном сервере.
               •     Лендинги. Самое проблемное место в проекте. Нужно писать
                     тонны лидовых данных. Для пользователей которые еще не
                     пользователи. И могут ими не стать.




Monday, February 25, 13
Sinatra
               •     Младший брат RoR, фреймворк для создания
                     однофайловых веб-приложений.
               •     Создание лендинговых страниц без полного
                     инстанцирования модельного слоя.
               •     В целом гипотеза была ошибочной,
                     стабилизировать лендинги на синатре мы так и
                     не смогли.
               •     Говорят async_sinatra помогает, но пробовать
                     пока негде.


Monday, February 25, 13
О высоких нагрузках
               •     Вы стоите под очень толстой струей воды.
               •     Пока написанный вами код пропускает ее через
                     себя без задержки, вы ее не замечаете.
               •     Как только он начинает лагать, последовательно
                     наедается все.
               •     Кошмар заказчика - 504тые по всем фронтам.
               •     До тех пор пока в команде кто-то не понимает,
                     что он пишет, любой деплой - катастрофа.



Monday, February 25, 13
Климат
               •     http://issendai.livejournal.com/572510.html
               •     Хочешь привязать к себе людей, держи их
                     слишком занятыми чтобы думать.
               •     Все задачи идут мимо jira.
               •     Большинство противоречат друг-другу по
                     приоритетам.
               •     Релиз в начале декабря, к 20тым числам
                     проект стабилизирован.


Monday, February 25, 13
Климат 2

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

Monday, February 25, 13
Климат 3
               • В отпуск мне сообщают, что я все
                     испортил.
               • Что ничего не работает (команда говорит
                     обратное).
               • Знакомые говорят, что их собеседуют на
                     моё место.
               • Мне отменяют премию за запуск.

Monday, February 25, 13
Внутренние цели
               • На протяжении всего года я говорил
                     себе, что взявшись за проект я не могу
                     позволить его бросить на середине.
               • Начинает возникать понимание.
               • Что проект закончен.
               • Лучше чем сейчас мне его не сделать.
               • А что терять - есть.
Monday, February 25, 13
Итог
               • В первый рабочий день 2012 года я подаю
                     заявление об увольнении.
               • В течении нескольких месяцев все
                     региональные зеркала переведены на
                     новый RoR движок.
               • Команда постепенно увольняется.
               • Заменяясь аутсорсерами.

Monday, February 25, 13
Выученные уроки
               • Дизайн нельзя менять вместе с
                     платформой.
               • Дизайн нельзя менять не понимая, что
                     продает.
               • Рельсы позволяют соревноваться по
                     скорости с самым пытливым умом.
               • Но не когда их четыре.

Monday, February 25, 13
P.S.




Monday, February 25, 13
Благодарности

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



Monday, February 25, 13
Другой взгляд на
                             события

               • http://www.slideshare.net/alexclear/
                     ruby-13262249
               • Наш DevOps.


Monday, February 25, 13

Más contenido relacionado

La actualidad más candente

Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaAlex Chistyakov
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned Alexander Syrotenko
 
13 октября, DEV {web} - конференция о Highload веб-разработке. "Архитектура п...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Архитектура п...13 октября, DEV {web} - конференция о Highload веб-разработке. "Архитектура п...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Архитектура п...IT-Portfolio
 
RTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwordsRTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwordsDaniel Podolsky
 
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...IT-Portfolio
 
E Kokovikhin - devconf 2012
E Kokovikhin - devconf 2012 E Kokovikhin - devconf 2012
E Kokovikhin - devconf 2012 Evgeny Kokovikhin
 

La actualidad más candente (7)

Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на Java
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned
 
Ryazan
RyazanRyazan
Ryazan
 
13 октября, DEV {web} - конференция о Highload веб-разработке. "Архитектура п...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Архитектура п...13 октября, DEV {web} - конференция о Highload веб-разработке. "Архитектура п...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Архитектура п...
 
RTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwordsRTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwords
 
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
 
E Kokovikhin - devconf 2012
E Kokovikhin - devconf 2012 E Kokovikhin - devconf 2012
E Kokovikhin - devconf 2012
 

Similar a Going to extreme

Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyAlex Chistyakov
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrusAlex Chistyakov
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...IT-Portfolio
 
UWDC'12, Александр Макаров, О командной разработке и фреймворках
UWDC'12, Александр Макаров, О командной разработке и фреймворкахUWDC'12, Александр Макаров, О командной разработке и фреймворках
UWDC'12, Александр Макаров, О командной разработке и фреймворкахAlexander Makarov
 
Как мы делаем Banki.ru
Как мы делаем Banki.ruКак мы делаем Banki.ru
Как мы делаем Banki.ruRoman Ivliev
 
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013Alex Chistyakov
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Serguei Gitinsky
 
How we built continuous delivery
How we built continuous deliveryHow we built continuous delivery
How we built continuous deliveryAlik Kurdyukov
 
Как мы готовим MySQL
Как мы готовим MySQLКак мы готовим MySQL
Как мы готовим MySQLBadoo Development
 
Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)Ontico
 
Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)Ontico
 
Распространенные ошибки применения баз данных
Распространенные ошибки применения баз данныхРаспространенные ошибки применения баз данных
Распространенные ошибки применения баз данныхSergey Xek
 
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...Ontico
 
Александр Курдюков. Внедрение continuous delivery для гетерогенных поставок.
Александр Курдюков. Внедрение continuous delivery для гетерогенных поставок.Александр Курдюков. Внедрение continuous delivery для гетерогенных поставок.
Александр Курдюков. Внедрение continuous delivery для гетерогенных поставок.ScrumTrek
 
Павел Прищепа. Бббыстрый бэкенд на базе друпал
Павел Прищепа. Бббыстрый бэкенд на базе друпалПавел Прищепа. Бббыстрый бэкенд на базе друпал
Павел Прищепа. Бббыстрый бэкенд на базе друпалKsenia Rogachenko
 
Павел Прищепа. Бббыстрый бэкенд на базе Друпал
Павел Прищепа. Бббыстрый бэкенд на базе ДрупалПавел Прищепа. Бббыстрый бэкенд на базе Друпал
Павел Прищепа. Бббыстрый бэкенд на базе ДрупалDrupalSib
 
CodeFest 2011. Макаров А. — Как разрабатывается Yii
CodeFest 2011. Макаров А. — Как разрабатывается YiiCodeFest 2011. Макаров А. — Как разрабатывается Yii
CodeFest 2011. Макаров А. — Как разрабатывается YiiCodeFest
 
My talk at Highload++ 2015
My talk at Highload++ 2015My talk at Highload++ 2015
My talk at Highload++ 2015Alex Chistyakov
 

Similar a Going to extreme (20)

Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на Ruby
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrus
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
 
UWDC'12, Александр Макаров, О командной разработке и фреймворках
UWDC'12, Александр Макаров, О командной разработке и фреймворкахUWDC'12, Александр Макаров, О командной разработке и фреймворках
UWDC'12, Александр Макаров, О командной разработке и фреймворках
 
Как мы делаем Banki.ru
Как мы делаем Banki.ruКак мы делаем Banki.ru
Как мы делаем Banki.ru
 
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013
 
How we built continuous delivery
How we built continuous deliveryHow we built continuous delivery
How we built continuous delivery
 
Как мы готовим MySQL
Как мы готовим MySQLКак мы готовим MySQL
Как мы готовим MySQL
 
Migrate!
Migrate!Migrate!
Migrate!
 
Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)
 
Как разраба
Как разрабаКак разраба
Как разраба
 
Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)
 
Распространенные ошибки применения баз данных
Распространенные ошибки применения баз данныхРаспространенные ошибки применения баз данных
Распространенные ошибки применения баз данных
 
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
 
Александр Курдюков. Внедрение continuous delivery для гетерогенных поставок.
Александр Курдюков. Внедрение continuous delivery для гетерогенных поставок.Александр Курдюков. Внедрение continuous delivery для гетерогенных поставок.
Александр Курдюков. Внедрение continuous delivery для гетерогенных поставок.
 
Павел Прищепа. Бббыстрый бэкенд на базе друпал
Павел Прищепа. Бббыстрый бэкенд на базе друпалПавел Прищепа. Бббыстрый бэкенд на базе друпал
Павел Прищепа. Бббыстрый бэкенд на базе друпал
 
Павел Прищепа. Бббыстрый бэкенд на базе Друпал
Павел Прищепа. Бббыстрый бэкенд на базе ДрупалПавел Прищепа. Бббыстрый бэкенд на базе Друпал
Павел Прищепа. Бббыстрый бэкенд на базе Друпал
 
CodeFest 2011. Макаров А. — Как разрабатывается Yii
CodeFest 2011. Макаров А. — Как разрабатывается YiiCodeFest 2011. Макаров А. — Как разрабатывается Yii
CodeFest 2011. Макаров А. — Как разрабатывается Yii
 
My talk at Highload++ 2015
My talk at Highload++ 2015My talk at Highload++ 2015
My talk at Highload++ 2015
 

Going to extreme

  • 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