Amazon Prime перейшов з мікросервісів на моноліт й зменшив кости на 90%

💡 Усі статті, обговорення, новини про DevOps — в одному місці. Приєднуйтесь до DevOps спільноти!

Марчін Кольни, Senior SDE у Prime Video, поділився кейсом про те, як скейлінг Prime Video аудіо та відео моніторингового сервісу дозволив зменшити кости на 90%. Даємо переклад його матеріалу з найцікавішими тезами.

Щоб переконатися, що клієнти безперебійно отримують контент, Prime Video створила інструмент для моніторингу кожного потоку, який переглядають клієнти. Цей інструмент дозволяє нам автоматично виявляти проблеми з якістю сприйняття (наприклад, проблеми із синхронізацією аудіо/відео) і запускати процес для їх усунення.

Команда з аналізу якості відео (VQA) у Prime Video вже володіла інструментом для перевірки якості аудіо/відео, але ніколи не планувала й не проєктувала його для роботи у високому масштабі (мета полягала в тому, щоб відстежувати тисячі одночасних потоків і з часом збільшувати їх кількість). Впроваджуючи більше потоків у службу, ми помітили, що запуск інфраструктури у високому масштабі коштує дуже дорого. Ми також помітили вузькі місця масштабування, через які не було можливості контролювати тисячі потоків. Отже, довелось переглянути архітектуру існуючої служби, зосередившись на вартості та масштабуванні вузьких місць.

Перша версія цього сервісу складалася з розподілених компонентів, які були організовані AWS Step Functions.

Двома найдорожчими операціями з точки зору вартості були:

  • оркестровка робочого процесу;
  • передача даних між розподіленими компонентами.

Щоб розв’язати цю проблему, ми перемістили всі компоненти в єдиний процес, щоб передача даних залишалася в пам’яті, це також спростило логіку оркестровки. Оскільки ми зібрали всі операції в єдиний процес, ми могли покластися на масштабовані екземпляри Amazon Elastic Compute Cloud (Amazon EC2) і Amazon Elastic Container Service (Amazon ECS) для деплойменту.

З мікросервісу на моноліт

Продукт складається з трьох основних компонентів:

  1. Медіаконвертер перетворює вхідні аудіо/відеопотоки на кадри або розшифровані аудіобуфери, які надсилаються на детектори.
  2. Детектори дефектів виконують алгоритми, які аналізують кадри та аудіобуфери в режимі реального часу, шукаючи дефекти (наприклад, зависання відео, пошкодження блоку або проблеми синхронізації аудіо/відео) і надсилають сповіщення в реальному часі щоразу, коли виявлено дефект.
  3. Третій компонент забезпечує оркестровку, яка контролює потік.

Початкове рішення було розроблено як розподілена система з використанням безсерверних компонентів (наприклад, AWS Step Functions або AWS Lambda), що було хорошим вибором для швидкого створення сервісу. Теоретично це дозволить масштабувати кожен компонент служби незалежно. Однак те, як ми використовували деякі компоненти, призвело до того, що ми досягли жорсткого обмеження масштабування на рівні приблизно 5% від очікуваного навантаження. Крім того, загальна вартість усіх блоків була надто високою, щоб прийняти рішення у масштабі сервісу.

На діаграмі показано безсерверну архітектуру власне сервісу:

Основним вузьким місцем масштабування в архітектурі було керування оркеструванням, що було реалізовано за допомогою AWS Step Functions. Сервіс виконував кілька state transition для кожної секунди потоку, тому ми швидко досягли лімітів облікових записів. Крім того, AWS Step Functions стягує плату з користувачів за state transition.

Друга проблема вартості стосувалась того, як ми передавали відеокадри (зображення) навколо різних компонентів. Щоб скоротити обчислювальні дорогі завдання з перетворення відео, ми створили мікросервіс, який розбиває відео на кадри та тимчасово завантажує зображення до сегмента Amazon Simple Storage Service (Amazon S3). Потім детектори дефектів (де кожен із них також працює як окремий мікросервіс) завантажують зображення та одночасно обробляють їх за допомогою AWS Lambda. Однак велика кількість звернень Tier-1 до сегмента S3 була дорогою.

Спочатку розглядали можливість окремого розв’язання проблем, щоб зменшити вартість і збільшити можливості масштабування. Ми експериментували та прийняли сміливе рішення: перебудувати інфраструктуру.

Розподілений підхід не надає багато переваг у конкретному випадку використання, тому логічно було об’єднати всі компоненти в єдиний процес. Це усунуло потребу у S3 як проміжному сховищі для відеокадрів, оскільки передача даних тепер відбувалася в пам’яті. Також реалізували оркестровку, яка контролює компоненти в одному екземплярі.

На наступній діаграмі показано архітектуру системи після переходу до моноліту.

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

У початковій версії ми могли масштабувати кілька детекторів горизонтально, оскільки кожен із них працював як окремий мікросервіс (тому для додавання нового детектора потрібно було створити новий мікросервіс і підключити його до оркестровки). Однак у новому підході кількість детекторів масштабується лише вертикально, оскільки всі вони працюють в одному екземплярі. Ми регулярно додаємо нові детектори до служби, і вони вже перевищили потужність одного екземпляра. Щоб подолати цю проблему, довелось кілька разів клонувати сервіс, параметризуючи кожну копію за допомогою іншої підмножини детекторів. Також був реалізований легкий рівень оркестровки для розподілу запитів клієнтів.

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

Висновки

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

Перенесення послуг на монолітну систему знизило витрати на інфраструктуру більш ніж на 90%. Це також збільшило можливості масштабування. Сьогодні ми можемо обробляти тисячі потоків і все ще мати можливості для подальшого масштабування сервісу. Перенесення рішення на Amazon EC2 і Amazon ECS також дозволило нам використовувати плани економії обчислювальних ресурсів Amazon EC2, які допоможуть ще більше знизити витрати.

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

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

👍ПодобаєтьсяСподобалось12
До обраногоВ обраному3
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

А що таке «кости» можливо «кошти»?)

Кошти — це ресурси, а кости — це витрати.
(угу, повторююсь)

Из

AWS Lambda

перешли на

Amazon EC2

и это

знизило витрати на інфраструктуру

Какая неожиданность.
Понимаю, что статья не только про это. Но улыбнуло.

Какая неожиданность.
Понимаю, что статья не только про это. Но улыбнуло.

В якому сенсі «улыбнуло»?
Так не могло бути?
Чи навпаки — це очевидне і дивно, що вони не знали?

(п.с. я з АВС тільки трохи знайомлюся)

це очевидне і дивно, що вони не знали

При активном использовании лямбды могут быть в разы или на порядок дороже виртуалок.
Возможно для внутренних продуктов у них другие тарифы, но даже так я думаю накладные расходы для безсерверных вычислений будут больше.
Для чистоты эксперимента им надо было сначала свои нано сервисы собрать в кубере и сравнить с лямдами.
А потом уже собрать нано сервисы в один микросервис.
Было бы интересно посмотреть на эти 3 цифры.

Хм, а де там став моноліт? Люди змінили боундаріс мікросервісів через обмеження платформи, обмазавши все це діло жирним шаром костилів.

Ми регулярно додаємо нові детектори до служби, і вони вже перевищили потужність одного екземпляра. Щоб подолати цю проблему, довелось кілька разів клонувати сервіс, параметризуючи кожну копію за допомогою іншої підмножини детекторів

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

ми створили мікросервіс, який розбиває відео на кадри та тимчасово завантажує зображення до сегмента Amazon Simple Storage Service (Amazon S3).
Це усунуло потребу у S3 як проміжному сховищі для відеокадрів

«I like to move it, move it»

S3 на тимчасове сховище окремих кадрів — це було маячнею з самого початку.

Стаття фактично зводиться до двох тверджень: (щоб таке вибрати за аналогію...)
1. Ми уніфікували перевозки, тепер усі листи і посилки по Україні проходять через центр в Києві! Це колоссальне спрощення логістики!
2. Ми помітили, що оскільки Дрогобич і Борислав це майже одне місто, ми тепер листи всередині цих міст, а також між ними, проводимо напряму, не передаючи в Київ! Трускавець на черзі! (Плач зі Стрия «а ми?» відкладений на царювання наступного президента.)

Хто знає український аналог ленінградовського «Если в башне по...нь, то что е...нь что не е...нь»? А то якось незручно на неї посилатись зараз, а іншого глобального коментаря під такими статтями я не можу підібрати.

Згадка про Борислав на доу ))) Несподівано )))

Як би задача мікросервісів (правильних мікросервісів, а не з однієї крайності в іншу де запускають 100500 мікросервісів по <1000 строчок кода кожен) це спростити розробку і підтримку, а не зменшити споживання ресурсів. Звісно моноліт буде швидшим і буде споживати менше ресурсів так як буде мати менше оверхеда.

Мікросервісна архітектура — не панацея. Та я мав неодноразові приклади коли навпаки розпилювали монстра з драконами на мікросервіси, і проект потрохи починав працювати, ступор у розробці припинявся, вдавалось забезпечити масштабування і т.д. Та для цілого ряду задачь — воно просто не треба. Чому роблять — бо просто копіюють Amazon 6 з книжки, як універсальне рішення.

Мікросервісна архітектура — не панацея.

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

копіюють Amazon 6 з книжки, як універсальне рішення.

лємінги від архітектури і культ кепки

кожному треба на носа кепку як у фаулєра і натягнути кепку до пояса

Повбивав би ото, тільки переводять електроенергію непонятно заради чого, якась совкова ТЕС і то ефективніше працює в більшості кейсів

Наболіло просто

Нарешті, а то набридло на кожну кнопку робити мікросервіс.

Норм. Через пару років на систем-дизайн інтерв’ю: як зробити із купи мікросервісів моноліт?

Так була інша ідея — зробити операційну систему, хоча скоріше контейнер, яка одночасно працює на декількох фізичних комп’ютерах. Чув наші вчені в Києві цим займаються для ArchiCAD, та таким чином збудовано цілий ряд «супер компьютерів», які роблять комбінацією блейд серверів і хитрим гіпервізором. Для цілого ряду рішень, скажімо де обчислень потрібно багато очислюванної потужності — при тому користувач лише один, наприклад моделювання процессів ядерного реактора — архітектура Amazon 6, з SOA не найкраща ідея.

зробити операційну систему, хоча скоріше контейнер, яка одночасно працює на декількох фізичних комп’ютерах

Ідея навіть є і жива, ну чи вже напівжива, називається SSI, single system image. Легенда тут — VAX

У vmware робиться щось подобноє в кілька кліків, але це хоч і близько але не то — VMware vSphere Fault Tolerance (FT)

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

В якомусь абстракному академічному сенсі k8s і є SSI ОС з єдиним мінусом — без live process migration/parallel execution. Цілком може бути колись впиляють в ядро і к8с підтримку і буде просто нова космічна ера розподілених систем

Судячи з усього Inferno можно легко запустити і так потверх кластера контейнерів оркестрованого Kubernetes. Та на ньому запускати якусь задачу, яка потребує високої паралельності — наприклад розпізнавання зображень в потоковому відео, робити чорно білі фільми цвітними і т.п.

розпізнавання зображень в потоковому відео, робити чорно білі фільми цвітними і т.п.

А, так таке то і зара давно ок

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

Inferno можно

Вас іст дас? Не знайшов що це

Ааа, я гріхом думав це якась чергова хайпова приблуда для к8с ))

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

Для всього найбільш критичного — якась значна підмножина наступних рішень:
1. Паралельна робота від 2 до 4 ідентичних залізяк і порівняння результатів.
2. Залізо спрощене до максимума, видалені всі сторонні ефекти, які складно передбачити. Якщо порівнювати з сучасними побутовими компʼютерами — грубо кажучи, ніяких кешів памʼяті, і замість оперативи на DRAM стоїть SRAM.
3. Тотальний контроль цілостности даних в процесорах, в памʼяті, на шинах. Без ECC чи чогось сильнішого в принципі не розглядається. І контроль реальний, а не как у Intel до Xeon, коли формально ECC є, а на практиці помилки на шинах ігноруються.
4. Де встигли — RAID на всю зовнішню памʼять. Можливо, оперативна памʼять на RAIM (як RAID але для памʼяті). Це допомагає у випадку незначних збоїв.
5. Всі шляхи ввода-вивода теж дубльовані (може до 3 ідентичних), спеціальні пристрої арбітража розбираються з розбіжностями.
6. Вся логіка проектується як скінченні автомати з виділеними точками синхронізації. Мова може бути теж спеціальна — або, якщо використовується щось більш типове, як C, то компілятори навмисно загрублені (бо що там GCC зробить із програми часто не знають навіть його автори). Компільований код повинен 1:1 відображати замисли автора і те, що можна легко прочитати в ньому.
7. Джерельний код верифікується якомога більше. У тяжких випадках він майже весь це допоміжні твердження його коректности.
8. В рантаймі проходить постійне самотестування системи. Всі вхідні і вихідні дані модулів помічені тегами, роль яких модулі не знають — знає тільки зовнішній шар керування, і він знає, які дані реальні, а які тестові.
9. І, звичайно, кожна розробка і доробка супроводжується кілометрами папіру на всі етапи:)

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

як зробити із купи мікросервісів моноліт?

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

www.gremlin.com/...​e-a-distributed-monolith

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

Більшість продуктів можна згорнути в один fat-деплоймент і стане тільки краще всім.

Чудовий загальний приклад, де це ідеально просто видно — gitlab omnibus vs gitlab/k8s/all-in-one vs gitlab/k8s/distributedсамєбісь

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

Ну то розкажи про свій, де мікросервіси врятували світ, ми послухаємо

Сорі в нетфлікс не працював, звиняйте вже

Кілька років тому працював на проекті, де був моноліт зі всіма його проблемами (перформанс, скейлінг, складність і затримки з деплойментами (по плану раз в місяць, але рідко коли це вдавалося), команди одна іншій заважають, блокують та роблять баги і т.і.), при цьому було десь до 50 інженерів. Під кінець моєї роботи там таки почали розпилювати. Після того прийшов в іншу компанію, де на той час монолітне ядро вже десь на 50% розбили на мікросервіси і зараз в моноліті залишилась зовсім невелика частина, яку можна вже вважати окремим мікросервіси. Так от, загалом бачу велику прірву між цими двома прикладами у якості роботи системи, масштабуванні та підтримці, простоті і швидкості розробки та прод деплойментів (більшість full CD), при тому, що над цією системою працює біля 300 інженерів.

Ну тут я згоден. Але я ж не про це

Є гамняні моноліти звісно, особливо в легасі проектах, там рефакторінг доктор прописав звісно.

Вирішує якість внутрішньої архітектури, а от як функціонал запакувати — то вже питання трохи інше.

Я про то, що дробити продукт на кусочки, бо фаулєр сказав мікросервіси — тупо і лише підвищує складність на порядки. А без якісного контролю архітекта це перетворюється в розподілений складний моноліт.

А якісно зроблений моноліт — легко потім дробиться теж, а l2-l3 operations в рази простіше виходять

Якщо взяти гітлаб — то для 99% інсталяцій омнібас ок і більше не потрібно. Я тому й приклад привів його, бо це мікросервіси запаковані в fat-deployment

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

Напевно не просто так народ пішов з монолітів на SOA. Це далеко не така вже і нова ідея із гетерогенними системами. Для типового web проекту який має горизонтально масштабуватись ідея хороша, власне архітектура розроблена самими Amazon і розповсюджена як claud native самим разом із AWS. Більшість народу все що завгодно так пишуть — ляп ляп і в продакшн не проектуючи, а це зовсім інша проблема не пов’язана з тим, що хтось не те видумав. Можете з’ясувати там де «наляпали» мікросервісів навіть нема загальної схеми що показує топологію сіті, там ніхто не знає навіть навіщо частина сервісів, хтось хто давно пішов з контори колись зробив і так воно і висить. Розбираєшся — а то моки які для автотестів треба на продакшн деплоять.

Стаття класна, заголовок від редакторів — як завжди

От-от, я прямо кожного разу з цього дивуюся. ДОУ іноді (як от зараз) може написати щось по ділу, але от людина, яка відповідає за заголовки, мені здається колись програла в покер бажання «Жодного заголовку без хайпу» і тепер відпрацьовує

зменшив кости
скейлінг Prime Video аудіо та відео моніторингового сервісу дозволив зменшити кости на 90%

«Кости» — то слово сучасної української мови? Оригінал:

Scaling up the Prime Video audio/video monitoring service and reducing costs by 90%
Кости

Якщо додати суфікс «-лі» то звучатиме цілком ревалентно і головне правдиво

Кости, ревеня, маржа.. Десь як софт, дебаг, таска — тільки з іншого казана.

Є таке слово: витрати

Досить паскудити українську мову

Дійсно, це якась маячня з цими перекрученням українських слів. Можна ж використати нормальне українське слово «кошти», хіба так важко?!

Кошти — це ресурси, а кости — це витрати.

Підписатись на коментарі