Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые Облачные Технологии)
SECON'2016. Панин Сергей, Лебедев Андрей, Храмушин Дмитрий,...
Transcript of SECON'2016. Панин Сергей, Лебедев Андрей, Храмушин Дмитрий,...
ИнфраструктураИнфраструктура
Рождение "Мое Дело"(MD 0.1.alpha)
Инфраструктура "Мое Дело"
Основные "подходы" к разработке• Ручная сборка кода программистами
• Ручной деплой в production
• Скрипты по почте
• Отсутствие возможности отката "версии"
• Отсутствие должного тестирования
• Ручное отключение сервиса на релиз (раз в неделю)
Мелкие шалости(MD 0.2.alpha)
Инфраструктура "Мое Дело"
Что мы имели на тот момент...• Терминирование SSL трафика на Nginx
• Частичный перенос бизнес логики на Nginx
Не имели, но очень хотелось :)• Мониторинг
• Логирование ошибок
Подходы к разработке сохранялись :)
Первые шаги в большом мире(MD 1.0.RELEASE)
Инфраструктура "Мое Дело"
Темная сторона "Мое Дело"• Распределение нагрузки (IP hash)
• Синхронизация контента между узлами
• Обслуживание узлов "кластера"
• Долгие релизы продолжались :(
Светлая сторона "Мое Дело"• Выделение QA как отдельного направления разработки
• Значительный рост команды
• Каждой команде "по тестовому серверу"
• Новый офис!!!
• Ломались подходы к разработке :)
Новая игрушка (Teamcity)• Версионность сборок (pack)
• Автоматизированная выкладка (deploy)
• Автоматическое тестирование (unit тесты)
• Обслуживание инфраструктуры (maintenance)
• Централизованное хранилище nuget пакетов
• Выключение сервиса "для чужих"
Работа над ошибками (первая двойка в четверти)
(MD 1.0.1.BUGFIX)
Сколько времени потребуется
на синхронизацию 1 000 000 файлов
между 2 серверами?
Сколько времени потребуется
на синхронизацию 5 000 000 файлов
между 10 серверами?
Новая животинка "Мое Дело"
Кто это? монгогрид или гридомонг?
Давайте накормим нашего нашу животинку...
И что мы видим???
Животинка вдруг выросла, да еще мутировала
Вот теперь это точно породистый реплисетовый гридомонг.
Не ошибается лишь тот, кто ничего не делает
(MD 2.0.RELEASE)
Мы снова переехали :)
Инфраструктура "Мое Дело"
Continious integrationTeamcity
Где мы используем Teamcity?• Прогон Unit тестов
• Build, Pack, Deploy приложения
• Прогон миграций
• Небольшое обслуживание инфраструктуры (Recycle, Server maintenance)
• Continious Inspection (SonarQube)
• Сборка Nuget пакетов
• Сборка npm пакетов
• Прогон автоматизированных тестов (Selenium)
Разбираемся с возможностями Teamcity• MSBuild
• Bash
• Windows CMD
• Powershell
• Plugins (Artifact Deployer, Node.js build runner)
• MetaRunner
• Teamcity Rest API
Hot (Re)DeployMD 3.0.RELEASE
Мы больше не увидим Андрюшу :(
Back-endBack-end
• CVSC
• Сборка на локальных машинах
• Прямое изменение структуры БД + mail-sharing
• Нет системы логирования
• Нет мониторинга
VCS• SVN (1 repo)
VCS• SVN (1 repo)
VCS• SVN (1 repo)
• TFS (1 repo)
VCS• SVN (1 repo)
• TFS (1 repo)
VCS• SVN (1 repo)
• TFS (1 repo)
• TFS (10-12 repo)
VCS• SVN (1 repo)
• TFS (1 repo)
• TFS (10-12 repo)
• Git (10-12 repo)
VCS• SVN (1 repo)
• TFS (1 repo)
• TFS (10-12 repo)
• Git (10-12 repo)
• Git (50+ repo)
Repo• Функциональные репозитории (бизнес код, общая схема именования
проектов и sln-файлов)
• Нефункциональные репозитории (полезные скрипты, общие
конфигурации codestyle и т.п.)
md-ci• Обновление локальных репозиториев
• Сборка бекенда
• Сборка фронтенда
• Инициализация структуры БД
• Обновление структуры БД
• Маппинг приложений на сайты IIS
• Запуск IIS
Continuous Integration
TeamCity (http://www.jetbrains.com/teamcity)
Continuous Integration
Continuous Integration
Continuous Integration
Continuous Integration
Microservices
Microservices
Database migrations• ручное редактирование БД иключено
• обновление состояния БД на всех окружениях
• единоразовое выполнение каждого изменения
• строго предустановленный порядок изменений
• получение изменений БД между версиями
• откат БД на более раннюю версию
Database migrationsFluent Migrations
http://www.github.com/schambers/fluentmigrator
Database migrations
Database migrations
Loggly (http://www.loggly.com)
NewRelic (http://www.newrelic.com)
Front-endFront-end
Новорожденный• Мало скриптов
• Мало стилей
• Js/css файлы лежат вместе с серверным кодом
• Js/css подключаются напрямую в html
• Нет ни ci, ни минификации, файлы загружатся по ftp
Мы идем в детский сад• Резкий рост количества файлов
• Combres - для минификации и бандлов
• Less вместо css
• Js/css файлы все еще в серверном проекте
• Подключение в html через api Combress
• Появляется ci. Файлы пакуются и диплоются вместе с серверным кодом.
Школьник• Нет Combres, Gulp - да
• Backbone
• Ядро статки(вендоры, общие стили, библиотеки и компоненты)
• Клиентский код вынесен из серверного проекта в отдельное место
Студент• Добавили версионность статики и ядра
• Marionette.js
• CDN
Невеста• Для сборки нового кода используется Webpack
• ESnext (ES6)
Невеста• Для сборки нового кода используется Webpack
• ESnext (ES6)
• PostCss
Невеста• Для сборки нового кода используется Webpack
• ESnext (ES6)
• PostCss
• Компонентный подход
Невеста• Для сборки нового кода используется Webpack
• ESnext (ES6)
• PostCss
• Компонентный подход
• MD-framework
Невеста• Для сборки нового кода используется Webpack
• ESnext (ES6)
• PostCss
• Компонентный подход
• MD-framework
• JSCS / Eslint
Невеста• Для сборки нового кода используется Webpack
• ESnext (ES6)
• PostCss
• Компонентный подход
• MD-framework
• JSCS / Eslint
• Ядро 2.0
Мы съезжаем• Отдельный репозиторий и отдельная сборка в TC (back-end и front-end
независимые)
• Скрипты для сборки gulp/webpack - npm пакеты
• Ядро статики - npm пакет
• Npm скрипты
npm start
Спасибо за внимание!