Серверлес з AWS Lambda та Quarkus: як ми оптимізували витрати у 1000 разів

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

Усім привіт! Я Андрій — Java Lead в компанії Geniusee. Сьогодні хочу поділитися своїм досвідом використання серверлесу в Java-проєкті та розповісти, чому я вважаю, що іноді це чудовий спосіб досягти кращих результатів для клієнта та компанії.

Традиційні серверні рішення часто не встигають масштабуватися під різкі зміни трафіку, що призводить до втрат запитів і збільшення витрат. У нашому випадку серверлес з AWS Lambda та Quarkus став без перебільшення вдалим вибором, який забезпечив ефективність, масштабованість і економічність. На власному прикладі розповім, чому серверлес може бути найкращим рішенням для сучасних проєктів.

Початкова ситуація

Під час роботи над одним із проєктів я зіткнувся з серйозною проблемою, яка впливала на стабільність і вартість системи. Серверне рішення клієнта мало стабільне середнє навантаження на рівні 200 запитів на хвилину, що не вимагало надмірних ресурсів. Однак особливості бізнес-процесів спричиняли раптові пікові навантаження, коли кількість запитів могла зростати до 5000+ на хвилину.

Такі піки виникали миттєво та були непередбачуваними, що значно ускладнювало планування інфраструктури.

Для обробки трафіку використовували ECS-інстанси, які масштабувалися горизонтально у відповідь на зростання запитів. Проте запуск нових серверів займав від 30 секунд до хвилини. У результаті інфраструктура просто не встигала адаптуватися до різких піків, що призводило до втрати GET-запитів, помилок у роботі сервісів та незадоволених клієнтів.

Окрім технічних складнощів, проблема мала й фінансовий вимір. У системі використовувалося понад 30 мікросервісів, кожен із яких потребував підтримки окремих інстансів ECS. Через нерівномірність навантаження більшість цих інстансів простоювала значну частину часу, працюючи без дійсного навантаження. Своєю чергою, клієнт не бажав тримати інстанси постійно активними, оскільки це спричиняло б значні витрати на підтримку інфраструктури.

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

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

Використання ресурсів було неефективним. Сервери ECS працювали без навантаження протягом більшої частини часу. У клієнта спостерігалися періоди простою, коли навантаження на систему значно знижувалося або його не було взагалі. Наприклад, у нічний idle time. Запуск додаткових машин, які б працювали постійно, не мав сенсу, адже це призвело б до невиправданих витрат.

Різке зростання запитів непердбачувано траплялося лише раз на тиждень або два через бізнес-процеси, через що неможливо було визначити точний період. Саме тому постійне функціонування великої кількості інстансів було нераціональним використанням ресурсів.

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

Рішення: перехід на серверлес з Quarkus

Командою ухвалили рішення перейти на серверлес-архітектуру, обравши AWS Lambda. Основними причинами вибору цієї технології стали її здатність автоматично масштабуватися відповідно до наявного навантаження, модель оплати «pay-as-you-go», яка дає змогу значно знизити витрати, а також висока доступність та інтеграція з іншими сервісами AWS, що було важливим для проєкту.

Наша основна задача: забезпечити мінімізацію змін у кодовій базі під час перенесення наявного сервісу на Lambda.

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

Раніше перехід на Lambda був можливий, але часто супроводжувався суттєвими труднощами. Однією з головних проблем були cold-start, особливо для Java-застосунків, які традиційно потребують більше часу на ініціалізацію в порівнянні з іншими мовами програмування. Це створювало затримки у відповідях і могло вплинути на користувацький досвід під час пікових навантажень.

Результат: які проблеми вдалось розв’язати

Перехід на Quarkus допоміг суттєво покращити продуктивність системи та мінімізувати проблему cold-start. Раніше час холодного старту сервісів міг займати кілька секунд, що було критичним для сценаріїв із короткотривалими запитами. Завдяки Quarkus cold-start тепер займає максимум 1,1 секунди, що значно прискорило роботу системи та забезпечило кращий користувацький досвід.

Окрім цього, продуктивність сервісів зросла в десятки разів. Наприклад, запити, які раніше на ECS і Spring Boot оброблялися за 500 мілісекунд, після міграції на Quarkus оброблялися лише за 13. Це забезпечило швидшу реакцію системи навіть під час пікових навантажень і значно знизило затримки.

Переваги серверлес-архітектури у цьому кейсі:

  • AWS Lambda дала клієнту змогу сплачувати лише за ті ресурси, які реально використовувалися. У періоди простою витрати на інфраструктуру були відсутні, а при пікових навантаженнях Lambda автоматично масштабувалася, забезпечуючи обробку додаткових запитів без втрат даних.
  • Lambda забезпечила миттєве масштабування системи, усунувши проблему затримок із запуском нових інстансів. Система адаптувалася до змін навантаження без додаткового втручання, гарантуючи стабільну роботу навіть у пікові періоди.
  • Перехід на серверлес зменшив потребу в адмініструванні інфраструктури та прискорив процес впровадження змін, що допомогло заощадити час і ресурси команди.
  • AWS Lambda забезпечила високу доступність системи, стабільно обробляючи запити навіть за раптових пікових навантажень.

До міграції клієнт витрачав понад $50 000 на рік на ECS-інфраструктуру, тоді як після переходу витрати знизилися до $46 на рік.

Чому саме Quarkus

На відміну від Spring Boot, який має довгий час ініціалізації та значне споживання пам’яті, Quarkus допоміг нам адаптувати сервіс для AWS Lambda без істотного переписування коду.

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

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

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

Після міграції на серверлес з Quarkus час обробки запитів зменшився в 150 разів. Ті ж запити, які раніше потребували 500 мілісекунд на традиційному серверному рішенні, на новій архітектурі обробляються за 13. Це значно покращило швидкість реагування системи.

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

Висновки

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

Однак коли сервіс не потребує постійного завантаження 24/7, має нерегулярні або пікові навантаження, та виконує короткотривалі запити, серверлес-архітектура стає не лише логічним, а й економічно вигідним вибором.

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

👍ПодобаєтьсяСподобалось14
До обраногоВ обраному5
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

Приєднуйтеся до чатику t.me/swarchua
Там було довге обговорення статі

якось більш схоже що було ще щось і не технічне зовсім.

Наприклад, було «обробити без помилок 99.9999» стало — обробити без помилок 99.

Відтак для першого варіанту поставили EC2 з навантаженням 1..2%, а в другому — можна і лямбда. Хто не встиг на розгортання — той запізнився.

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

Можете написати найшвидшу реалізацію функції косінус?
Можу:
double cos(double x) { return 0;}

, точність буде ±10^0 замість ± 10^-15 зато перформенс — разів в 50 порівняно з gnu c library

Доброго дня, ріквест був від бізнесу якраз щоб були опрацьовані всі ріквести, цього зображення в статті немає (саме цієї статистики) вона тут є лише частково, але еррор рейт був 0, тобто всі ріквести отримали успішний респонс, найбільший тайм період що я дивився це було 3 тижні і проблем не було з цим.

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

Доброго дня. Основний посил статті трохи про інше, однак відповідаючи на ваше питання звісно розглядались інші варіанти і відомо було про інші варінати (як мінімум проект до цього був на спрінгу) конкретно під наші вимоги кваркус був кращим варіантом по масштабуванню і колд старту. Більш детальні порівнянні є в т.ч від AWS так і на іших популярних ресурсах в англомовному комьюніті.

До речі, а чому не app runner? коли треба scalability то, це новіша і дешевша альтернатива для lambda.

Там 46$ в год не получиться никак похоже по Pricing, если правильно понял.

springboot також вже давно суппортить нейтів імеджи і нічим не гірше це працює аніж в quarkus. Працював і з тим і з іншим і все таки зі спрингом мені зручніше — багато речей вже написані і не треба щось костиляти + детальна документація та велике комьюніті яке швидко знаходить проблеми, а не як у мене коли ти перший стикаєшься або коли це тільки знайшли та воно ще очікує фікса.
І ще якщо це свій окремий сервіс — то з нейтів імеджами там свої пріколи з метріками та профайлінгом і тоді стає весело, не кажучи про додаткову налаштування щоб воно почало працювати на нейтів імеджі але з таким профітом авжеж воно того вартує і результат крутий!

Доброго дня, дякую за коментар. Частково я з Вами погоджуюсь, що стосується комьюніті в Спрінга воно однозначно більше, так в Кваркуса можуть бути певні не критичні (при наймні для мене) незручності. В нашому випадку був супер критичний колд старт на випадок потреби в масштабуванні лямди під час пікового навантаження і як не крути в Кваркуса він кращий + середовище яке більш націлене на обмеженому використанні рефлексії (бібліотеки) буде давати кращий результат. Але знову ж таки це наш випадко і наші вимоги суть статті полягає якраз в тому, щоб використовувати можливості під вимоги бізнесу а не просто робити по шаблону. В випадку якщо вимоги були б іншими Спрінг був би кращим варіантом через те що більше людей з ним знайомі хоч і вимагав би більшого від їх навчок по дизайну коду.

Чи є у вас статистика по часу відповіді для p90, p95, p99?

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

46$ в год это неплохо конечно, но как можно было это превратить в 50000$.
Даже наши чиновники завидуют.

втиснутися в бюджет 50$ за рік з вимогами типу

— ріквести рівні 200 — 5000+ запитів на хвилину
— 500 мілісекунд на ріквест

і з мікросервісною архітектурою — то не дуже реально...
Так що я би так прямо не порівнював. Ще не відомо, як виглядали би ті два рахунки, якби навантаження зросло до 200 і 5000 ріквестів в секунду, а не в хвилину...

— 500 мілісекунд на ріквест

Це звісно залежить від логіки, але 500 мс — це дуже ненапряжна вимога. Знову ж, якщо вони 13 на лямбді+кваркус — це означає, що там не було ніякого складного ІО/мережевих взаємодій, чи навіть числодробилки (джит би розігнався).
З великою ймовірністю там просто був якийсь мутний неефективний код, який робив забагато.

Далі «диванна аналітика»:

$46 на рік

46/12 == 3.80 на місяць
Ось ця сторінка каже s3.amazonaws.com/...​s/pricing-calculator.html
що 3.80 — це при використанні менше 1Гб пам’яті та середньому часу реквеста 13 мс
20000000 реквестів/місяць
— 30днів*24год*60хв*60сек — 7.7 запитів/сек
— 22робочих дня*8год*60хв*60сек — 31.6 запитів/сек

200 запитів/хв — це 3.3 в секунду
5000 — 83 РПС

Igor Golodnitsky задав абсолютно правильне питання — як на таких вимогах витратити 50К?
0.71808*24*365==6290.3808
Це треба 7-8 отаких ЕЦ2
m8g.4xlarge
$0.71808
16
64 GiB
EBS Only
Up to 15 Gigabit

Може у бюджет ще входила зарплата людини яка всі ті сервера підтримувала. А теперь «воно працює само».

Доброго дня, по-перше мушу подякувати за Ваш обширний коментар і Ваш час. По-друге, що до самого коментаря: повністю згоден з першою частиною це класичний простий проект без складного CPU обчислення, щодо другої частини як я писав в іншому коментарі це ж не просто х сервісів і все, це проект де є різна кількість енваєрментів і не один маркет що і генерувало кост.

Доброго дня, рахунок виглядав би всеодно на користь лямди конкретно в цьому. В лямдах ви платите за час використання а не 24.7 + не забувайте за free tier, в цьому проекті не було складних CPU операцій тому і довгого дюрейшена виконання. Але суть статті трохи в іншому, стаття не про те що ось це хороше а це погане, стаття про те що при розробці і дизайну інфраструктури треба зважати на потреби бізнесу, а не просто робити шаблонно бо так звикли.

как можно было это превратить в 50000$

В мене на проекті девопси репортали як вони зробили −10к$ в місяць костів.
Тупо зменшили розмір інстансів на не прод енвах з прод розмірів на малі.

Ще якісь серваки «просто ранились», які забули погасити кілька років тому)

Ми на трьох проєктах перенесли не-прод сервіси на окремий сервер на Hetzner за 40$ на місяць. Мінус ~$800 в рахунках від AWS. Ще суттєво виграли в швидкості деплою та взагалі в швидкості дев-застосунків.

Минулого року робили невеликий подкаст на цю тему Moving out of the cloud.

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

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

Цікаво, що зменшило час обробки запитів?
Може в лямбдах cpu або io швидше? Чи все ж таки кваркус зарішав?
Я розумію буст старту, а ось час обробки — хз?

Мабуть базу даних змінили на хмарну

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

Доброго дня. Нажаль прям точної відповіді з % надати не зможу, що повпливало і в якому співвідношенні, в основному тощо збір подібної метрики зайняв би дуже багато часу і прям повністю її зібрати неможливо було (поясню трохи пізніше). Стосовно припущень, CPU маловірогідно конфігурація лямд надавала там далеко не супер топові варіанти CPU (просто нагадаю що прям обрати CPU Ви не можете, CPU буде залежати від того скільки оперативної пам’яті ви оберете. Якщо говорити за те що використовувалось в нас а це лямди 128 мб і 512 мб то альтернативої їм є t2.nano або t3.nano і t3.micro або t2.micro EC2. ІО точно став швидшим і також сильно вплинув Кваркус з нативкою. Тепер до найбільш цікавого чому зібрати точну метрику було неможливо, причиною цього був баг у AWS, а саме холостий простой запиту коли ріквесту пішов але до лямди не дійшов і знаходиться в простої або подібні випадки які були помітні на X-Ray. Це не займало супер багато часу, тому це не було чимось критичним для бізнесу, але подіну метрику 100% б заафектило. Нажаль більш детально розповісти не можу.

Ви використовуєте GraalVM Community Edition — це безкоштовно для продакшну та білдів (чи це дозволяє ліцензія)? Якщо ні, то скільки там потрібно платити?

Доброго дня, Community Edition — вона безкоштовна.

Ви використовуєте тільки binary/native executable для всіх мікросервісів,
чи native executable Ви використовуєте тільки для найбільш ресурсоємних запитів?

Доброго дня, тільки нативний варіант.

Одна проблема: в масштабе лямбды дорогие, и приходится обратно в ЕС2 возвращаться.

Доброго дня, стаття якраз про те що потрібно розглядати кожен випадок окремо і кожен проект окремо. Конкретно в цьому проекті, як не крути навіть якщо лоад буде стрибати до набагато більших значень найвигіднішим варіантом буде лямди. Якщо ви бачите що буде велике стабільне навантаження 24.7 з великим використанням CPU або часом виконання то лямда це не Ваш варіант, але якщо ви розумієте що в вас величезний час простою то немає сенсу тягнути туди щось дороге по інфраструктурі (також будемо пам’ятати про free tier). Нажаль тотальна більшість не зважає на це і генерує величезні кости за інфру там де це не потрібно, просто тому що або працювали тільки з таким, або вже звикли до чогось одного від чого в результаті буде страждати бізнес.

Для пиковых нагрузок лямбы могут быть выгодней. Но наверное мой опыт в интернациональных проектах, в которых пики на локальное время в разных таймзонах по всему глобусу приводили к ± равномерной нагрузке — и в том сценарии лямбы стоили космос.
Но мне стоило бы это все написать сразу.

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