Кращі практики без сервера

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

Більшість практикуючих серверів, які підписалися на ці практики, працюють в масштабах. Обіцянка безсерверної роботи в основному виконується як на високому масштабі, так і на бурхливих робочих навантаженнях, а не на відносно низькому рівні, тому багато цих кращих практик виходять із кута масштабу, наприклад. Nordstrom в роздрібній торгівлі та iRobot в IoT. Якщо ви не маєте на меті масштабувати так далеко, то, ймовірно, ви можете піти, не дотримуючись цих кращих практик.

І пам’ятайте, що найкращі практики - це не «єдині практики». Найкращі практики покладаються на набір основних припущень. Якщо ці припущення не відповідають вашому випадку використання, то ці найкращі практики можуть не відповідати.

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

Тож це мої найкращі практики, як я їх бачу.

Кожна функція повинна виконувати лише одне

Йдеться про помилку функції та ізоляцію масштабування.

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

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

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

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

Функції не викликають інших функцій

Функції, що викликають інші функції, є антитілом.

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

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

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

Використовуйте якомога менше бібліотек у своїх функціях (бажано нульових)

Це мені здається очевидним.

Функції мають холодні запуски (коли функція запускається вперше) і теплі запускаються (вона запускається і готова до виконання з теплого басейну). На холодні старти впливає ряд речей, але розмір zip-файлу (або, однак, код завантажений) є його частиною. Також кількість бібліотек, які потрібно інстанціювати.

Чим більше у вас коду, тим повільніше стартує холод.

Чим більше бібліотек, яким потрібно інстанціювати, тим повільніше починається холод.

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

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

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

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

Уникайте використання служб на основі з'єднання, наприклад RDBMS

Просто не треба, якщо вам не доведеться.

Цей вб'є мене в найбільшу неприємність. Багато людей із веб-додатків скачуть на прокладці "але RDBMS - це те, що ми знаємо".

Мова не про RDBMS. Це стосується з'єднань.

Без сервера найкраще працює з сервісами, а не з підключеннями.

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

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

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

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

Одна функція на маршрут (якщо використовується HTTP)

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

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

Але тоді ви все-таки використовували якийсь інструмент управління конфігурацією, щоб запустити все, що ви не були? А ви вже використовували інструменти CI та CD якогось права? Вам все ще доведеться розробляти DevOps без сервера.

Навчіться використовувати повідомлення та черги (async FTW)

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

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

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

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

Потоки даних, а не озера даних

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

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

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

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

Я знаю, що цей момент є дещо більше "там", ніж інші, але зробити це не просто.

Просто кодування масштабу - помилка, ви повинні врахувати, як вона масштабується

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

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

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

Висновок

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

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

Чекаємо почуття думок інших людей. Досить впевнений, що я заграю людей, які мені говорять, що я не прав про RDBMS. Як і з контейнерами, я не ненавиджу RDBMS, але люблю використовувати правильні інструменти для правильних завдань. Знайте свої інструменти!