Top Banner
Березень 2013 Андрій Корнілов Тернопіль Кілька банальних рецептів успішного веб- проекту
49

Корнілов Андрій

May 25, 2015

Download

Technology

Кілька банальних рецептів успішного веб-проекту
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Корнілов Андрій

Березень 2013

Андрій Корнілов

Тернопіль

Кілька банальних рецептів успішного веб-проекту

Page 2: Корнілов Андрій

Про мене

Зараз Technical Lead @Rebbix, Lviv

VNU Vacature media (Netherlands/Belgium)

В минулому bitternet.ua, stelex.com (General Electric), markplaats.nl

(eBay classified group), lofty.com, знову markplaats.nl (eBay classified group), modnakasta.ua

Інтересиphp, python, software engineering stuff

Page 3: Корнілов Андрій

Про презентацію

Коротенький огляд специфіки проектів з високою відвідуваністю та корисних підходів, які можуть допомогти таким проектам бути

успішнішими

Page 4: Корнілов Андрій

Про презентацію

Коротенький огляд специфіки проектів з високою відвідуваністю та корисних підходів, які можуть допомогти таким проектам бути

успішнішими

Хоча, можуть і не допомогти - якщо проблеми лежать за межами software engineering

Page 5: Корнілов Андрій

Про дивну назву

На практиці всі підходи та архітектурні рішення для вебу статичні.

Для більшості проблем давно знайдено прийнятні рішення.

Девелоперу залишається лише визначити з проблемою якого саме виду він зіткнувся і

вибрати рішення, яке дозволить вирішити цю проблему

Page 6: Корнілов Андрій

Про дивну назву

При чому рішення це, як правило, не міститиме ніякого рокет-сайнс

Page 7: Корнілов Андрій

?!???>>!!!...

Page 8: Корнілов Андрій

Високо навантажений проект

Таким чином поняття high loaded проекту коже може трактувати на власний розсуд :-)

В побутовому сенсі - це ресурс, який має високу (wut?) відвідуваність

Як правило, high loaded проект, з технічної точки зору, це апаратно-програмний комплекс, який складається з багатьох взаємодіючих підсистем - тобто розподілена система, при чому ця система перебуває під впливом

високо конкурентного доступу.

Page 9: Корнілов Андрій

Високо навантажений проект

Для ресурсів, які активно використовуються (іншими словами - високо навантажених), нема поняття "це мало

імовірно, для цього потрібен надзвичайний збіг обставин, тому це ніколи не станеться"

Підходи до обробки запитів в високо-навантажених проектах співпадають з підходами теорії масового обслуговування (звичайні черги, аеропортні черги,

паралельне обслуговування)

Page 10: Корнілов Андрій

Часткова коректність

В високо навантаженій системі з багатьма компонентами в даний момент, швидше за все, є компонент з яким в даний

момент щось не так - не працює реплікація, певний відсоток даних є не коректним тощо.

Шукайте можливість бути частково доступними - повертайте якісь результати, навіть якшо ваша система дає частковий збій.● Поверніть хоч якісь результати пошуку, якщо не

можете повернути детальні.● Якщо не можете отримати підтвердження оплати в

банку, позначте замовлення як частково підтверджене і переходьте до наступного кроку.

Page 11: Корнілов Андрій

Часткова цілісність

Маленький чіт - стан системи такий,яким його бачить користувач.

Якщо користувач не може побачити порушення цілісності даних - її нема.

Приклад. Якщо ви написали коментар до сторінки і, практично в той самий момент, хтось її відкрив - не важливо, щоб він побачив ваш коментар, важливо щоб ви його побачили. Таке саме можна сказати, наприклад, про відображення резервації товару в каталозі інтернет магазину. Часто саме це забезпечує кешування (але не завжди кеш мість не актуальні дані - залежить від політики інвалідації)

Page 12: Корнілов Андрій

Успішність / Не успішність

Успішність чи не успішність проекту (з точки зору інженера) залежить від того, які фактори ризику можуть

впливати на цей проект і чи ці фактори (в достатній мірі) зкомпенсовані

Page 13: Корнілов Андрій

Деякі важливі фактори ризику

● людські фактори - загальний рівень команди, помилки в силу психо-фізичного стану

● технічні фактори○ адекватна інфраструктура навколо проекту -

документація, тести, метрики коду○ складність проекту - чим складніша система тим

більша імовірність помилки○ технічні несподіванки

● фактори залежності і контролю○ залежність від коду, який ви не контролюєте○ залежність від систем, які ви не контролюєте

Page 14: Корнілов Андрій

Людський фактор

Всі люди - люди*

І, в силу цього, час від часу, роблять помилки. Через хибні припущення на основі не достатньої інформації. При написанні коду. При виконанні певних дій (особливо

рутинних)* (с) моя дружина

Page 15: Корнілов Андрій

Людський фактор

Запобіжні підходи

● детальна (і головне - актуальна) документація● тести (юніт, функціональні etc)● використання певних практик (кодревью, парне

програмування)● формальні процедури (регламенти, git-flow)● автоматизація дій (білд, деплоймент)

Page 16: Корнілов Андрій

Технічні фактори

З технічною складністю дозволяє боротися декомпозиція системи на простіші компоненти

Типові компоненти:● медіа сервери (media, assets)● бекінг сервіси (db, cache, queues, search)● апп-сервери● бекграунд воркери

Про технічні несподіванки і фактори залежності поговоримо в одному з наступних розділів презентації -

twelve factor application

Page 17: Корнілов Андрій

Shared nothing

Shared nothing архітектура це концепція розподіленого компьютінгу в які кожна нода є незалежною і

самодостатньою (в плані обчислювальних активностей). Або більш конкретно - ноди не використовують спільно

пам'ять чи дисковий розділ. Концепція зараз широко використовується, в основному, в

вебі (хоча започаткована була в середині 80-х для баз даних) і практично безлімітно скейлиться (що довів

Google). Для веб-додатків стан при цьому зберігають спеціально призначені backing сервіси

Для баз даних SN знаходить відображення в концепції шардінгу.

Page 18: Корнілов Андрій

Feature flags

Feature flags - реальний спосіб зменшення ризиків при розгортанні нової функціональності в умовах великого

навантаженняЦю концепцію часто помилково асоціюють лише з A/B тестуванням. Але, поряд з цим, використання флагів дозволяє запускати нову функціональність (часто з

непрогнозованим performans ефектом) лише для певної групи чи відсотку користувачів.

Таким чином можна навіть проводити поступову міграцію користувачів з однієї платформи на іншу.

Page 19: Корнілов Андрій

"Правильні інструменти"

Використовуйте правильні інструменти для кожної із своїх задач● З пошуком у великому масиві даних краще справиться

спеціалізований сервер пошуку (SOLR, ElasticSearch, Sphinx) ніж реляційна база даних

● В якості медіа сервера краще виступить легкий веб сервер ніж apache

● Мільйон інших прикладів...

Page 20: Корнілов Андрій

Метрики

Єдиний спосіб переконатися, що робота зроблена добре і взагалі все іде добре (в плані тенденцій)

● метрики коду - sonar● системний моніторинг - munin, zabbix, new relic● метрики бізнесу (транзакції певного типу) - new relic,

graphite, google analytics● rum (performance monitoring) - new relic

І навіть передбачити майбутні проблеми(Навчіться прогнозувати запас ресурсів)

Page 21: Корнілов Андрій

Метрики

Збір метрий єдиний спосіб подолати розрив між вашими уявленнями про те, як ваша система працює в продакшен

і між тим як вона працює насправді. Розуміння різниці між тим, як поводила себе система до

релізу і після релізу відрізняє успішний інженіринг від шаманства.

Звичайно, самих метрик часто не достатньо для розуміння того, що саме потрібно робити з проблемою, але вони

необхідні для розуміння того, що робити таки щось треба (або не треба).

Page 22: Корнілов Андрій

12-Factors App

12-factor app це набір правил, які дозволяють:

● Використовувати декларативні формати конфігурування;

● Мати чіткий "контракт" з операційною системою, за рахунок чого досягається максимальна портабельність між середовищами, легке розгортання в клауд;

● Мінімізувати відмінності між розробницьким і продакшен середовищем;

● Дозволяє масштабувати проект без суттєвих змін інструментів, архітектури коду і процесу розробки.

Page 23: Корнілов Андрій

12-Factors App

Ця методологія може бути застосована до веб додатків, написаних з використанням будь-якої мови

програмування, і з використанням будь-якої комбінації backing services (база даних, черга, кеш тощо)

Page 24: Корнілов Андрій

12-Factors App

Єдина codebase, яка знаходить в системі контролю версій -

багато регулярних розгортань (deploys)

Page 25: Корнілов Андрій

12-Factors App

● Якщо система складається з кількох codebases, це не додаток – це розподілена система. Кожен компонент розподіленої системи це окремий додаток і має інтивідуально задовольянти вимогам 12-factor app.

● Кілька додатків, які використовують спільний код порушують ці принципи. Спільний код має бути виділено в бібліотеку, яка має бути включена в систему як будь-яка інша залежність.

Page 26: Корнілов Андрій

12-Factors App

Розгортання (deploy) це примірник додатка, який виконується. Це може бути продакшен сайт, один чи кілька тестових сайтів, сайт в

робочому середовищі розробника.

Код має бути спільним для всіх розготань, за виключенням того, що розгорнуті версії коду

можуть різнитися.

Page 27: Корнілов Андрій

12-Factors App

● Додаток ніколи не має робити припущень про систему, на якій буде виконуватись з точки зору своїх залежностей, декларує залежності явно і в повній мірі через dependency declaration manifest.

● Уникайте випадків, коли залежності одного додатку можуть впливати на інший додаток або на інше розгортання цього самого додатку. Для цого використовуйте ізоляцію залежностей.

● Це правило має бути чинним для будь-яких типів середовищ

Page 28: Корнілов Андрій

12-Factors App

В ruby для декларації залежностей використовуються Gemfile, для ізоляції залежностей - bundle exec.

В python для декларації залежностей використовуються pip + requirements.txt, virtualenv - для ізоляції залежностей.

В java-sctipt - bower.

В php - Composer

Page 29: Корнілов Андрій

12-Factors App

Page 30: Корнілов Андрій

12-Factors App

Розробники маніфесту про 12-factor додатки також наполягають на тому, що не варто покладатися на

наявність в системі будь-яких залежностей. Наприклад ImageMagick чи curl. Аргументуючи це тим, що не можливо

гарантувати їх наявності взагалі чи наявності сумісної версії.

На мою думку, такий підхід є перебільшенням, адже такого роду залежності можна задовільняти з допомогою таких інструментів як Chef і Puppet (хоча, мушу визнати,

при цьому опускаються вимоги ізоляції залежностей)

Page 31: Корнілов Андрій

12-Factors App

Граф залежностей і конфлікти залежностей

Досить часто залежності можуть перетворитися в коштар. Особливо, якщо у ваших залежностей є свої, не відомі

вам, і , при цьому, все це знаходиться за межами ваших можливостей контролю.

Якщо бібліотека, яку ви маєте намір використати, реалізує якусь просту функціональність - це привід

задуматися, чи потрібна вашому проекту зайва залежність. Не ставайте залежними від когось, без

достатніх підстав.

Page 32: Корнілов Андрій

12-Factors App

Зберігайте конфігурацію в змінних оточенняКонфігурація додатку це будь-що, що відрізняє одне

розгортання від іншого (за винятком версії коду). Вона може включати:

● Параметри конекту до backing services (бази даних, Memcached)

● Параметри конекту до зовнішніх сервісів (Amazon S3, Twitter API)

● Ім'я хоста тощо

Page 33: Корнілов Андрій

12-Factors App

● Інколи конфігурацію включають в код у вигляді констант - це не припустимо з точки зору додатку, який відповідає вимогам 12-Factors App. Адже конфігурація це єдине, що має відрізняти різні розгортання додатку. І в жодному разі не код.

● Інший підхід - зберігати конфігурацію в окремих файлах, за медами коду теж не вітається, оскільки легко можна припустися помилки і додати їх в репозиторій, або складно забезпечити ізоляцію конфігурацій

● Групування конфігурацій по типам середовища - досить легко може перетворитися в некерований процес.

Page 34: Корнілов Андрій

12-Factors App

Чітко розділяйте етапи зборки, розгортання і виконання коду

Page 35: Корнілов Андрій

12-Factors App

Збірка це етап на якому створюється певний артефакт-набір коду, залежностей, асетів (при потребі компілюється

бінарний файл)Розгортання об'єднує артефакт, ориманий на етапі зборки, з відповідним конфігами. Результат - сутність,

готова до виконання в певному середовищіВиконання - запуск коду в середовищі у вигляді процесу

або набору процесів.

Заборонено вносити зміни в код, який виконується

Page 36: Корнілов Андрій

12-Factors App

Завжди виконуйте свій додаток в середовищі як один (частіше всього на девелоперському середовищі) або

кілька (частіше всього на продакшен) stateless процесів.

Будь-які дані, які вимагають збереження, мають зберігатися на stateful backing сервісі - найчастіше в базі

даних.Локальна пам'ять або файлова система можуть

розцінюватися виключно як короткотерміновий кеш (наприклад для зкомпільованих темплейтів, завантажених

файлів), при цьому ніколи не робиться припущення що дані в цьому кеші завжди доступні для наступного

реквеста - адже він може потрапити на інший сервер чи процес.

Page 37: Корнілов Андрій

12-Factors App

Масштабування через процеси - в twelve-factor app архітектурі процеси це

основоположний елемент.З використанням цієї простої концепції

програміст може забезпечити масштабування в широких межах поділяючи певні типи

навантаження між відповідними процесами.Наприклад одні типи процесів відповідають за обробку http запитів, інший тип відповідає за

виконання "довгих" задач в бекграунді.

Page 38: Корнілов Андрій

12-Factors App

Таким чином, щоб проскейлити певний тип навантаження (у відповідності до концепції shared nothing) треба просто

добавити ще процеси певного типу

Page 39: Корнілов Андрій

12-Factors App

Crash only design

Дизайн процесів має передбачати випадок того, що процес може раптово припинити своє виконання - при цьому всі ресурси, які він використовував мають бути звільнені, дані з бекінг сервісів в жодному разі не має бути

пошкоджено, для воркер процесів - не виконана задача має бути повернута на

виконання іншим процесом

Page 40: Корнілов Андрій

12-Factors App

Розглядайте логи як потік подій

Логи додають візуалізацію поведінки додатка. При цьому, додаток, розроблений у відповідності з

правилами 12-factor не займаються обслуговуванням інфраструктури логів (не

відкривають спеціальний лог файл тощо) вони просто пишуть потік подій в stdout.

Під час локальної розробки програміст бачить цей потік в терміналі і таким чином спостерігає за

поведінкою додатка.

Page 41: Корнілов Андрій

12-Factors App

На стейджінг і продакшен середовищах кожен такий потік перехоплюється середовищем, агрегується з іншими потоками і може бути відісланий для подальшого зберігання чи

перегляду. Ці подальші дії жодним чином не відомі самому додатку

Page 42: Корнілов Андрій

12-Factors App

Детальне логування success кейсів - надмірнеError кейси потрібно логувати якомога

детальніше

Page 43: Корнілов Андрій

12-Factors App

Ваші середовища для розробки, тестування та продакшен мають бути максимально

уніфіковані

Це дозволить уникнути технічних несподіванок, про які ми починали говорити

раніше

Page 44: Корнілов Андрій

12-Factors App

Розриви в часі: Розробник може писати код дні, тижні і навіть місяці перед тим, як код потрапить на продакшен.

Розриви у відповідальності: Розробник пише код, DevOps інженер розгортає його.

Розриви в інструментах: Для розробки використовується Nginx+SQLite+OS X, а на продакшені - Apache+MySQL+Linux.

Page 45: Корнілов Андрій

12-Factors App

Сучасні інструменти менеджменту пакетів (homebrew, apt, yum), декларативні

інструменти провіженінгу (Chef і Puppet) в сукупності з легкими система управління

віртуальними середовищами (Vagrant, kvm) дозволяють розробнику запускати локально середовище, яке максимально близьке до

продакшен

Page 46: Корнілов Андрій

Адміністративні задачі

Виконуйте адміністративні задачі як специфічний процес додатка

Адміністративні задачі це задачі, які необхідно виконувати поряд з основною - обслуговування web запитів. Такі, як: ● міграція схеми бази даних (manage.py syncdb в Django,

rake db:migrate в Rails)● виконання REPL shell● виконання одноразових скриптівАдміністративні функції мають виконуватися з усіма тими самими обмеженнями, що і звичайний 12-factor додаток - з тими самим кодом, залежностями, ізоляцією. Адміністративний код має включатися в код додатку для уникнення проблем синхронізації версій коду.

Page 47: Корнілов Андрій

Посилання

● The Twelve-Factor App - http://www.12factor.net/● http://devopsreactions.tumblr.com/● http://www.perfplanet.com/● http://www.vagrantup.com/

Page 48: Корнілов Андрій

Q&A

Page 49: Корнілов Андрій

Дякую за увагу!

Андрій Корнілов

Копанія: Rebbix

Email: [email protected]