Системи, які ми будуємо сьогодні, у певному сенсі відрізняються від програм, які ми створювали десять років тому. Мікросервіси спілкуються один з одним через мережеві кордони, розгортання відбуваються постійно, а не щоквартально, і збої поширюються непередбачуваним чином. Проте більшість організацій все ще підходять до якості та надійності з інструментами та методами, які краще застосовувати в минулій епосі.
Застарілі інструменти контролю якості були розроблені для монолітної епохи додатків та пакетного розгортання. Окрема тестова команда могла перевірити всю систему перед випуском. Спостереження обмежувалося лише статусом сервера та відстеженням роботи додатку. Винятки були достатньо рідкісними, щоб їх можна було обробляти вручну.
Розподілені системи руйнують ці припущення на шматки. Коли шість сервісів розгортаються окремо, централізоване тестування стає вузьким місцем. Коли збої можуть виникати через розділення мережі, залежності від таймаутів або каскадні перевантаження, прості перевірки працездатності є оптимістичними. Коли події відбуваються достатньо часто, щоб вважатися нормальною роботою, спеціальні процедури реагування не масштабуються.
Команди починають із спільних інструментів, впроваджують моніторинг та тестування, і нарешті додають практики надійності на рівні сервісів. Кожен окремо має сенс, але разом вони руйнують підприємство.
Це ускладнює певні речі. Налагодження чогось, що охоплює сервіси, означає перемикання між інструментами логування з різними формами мов запитів. Надійність на рівні системи означає кореляцію вручну з несправних інформаційних панелей.
Побудова фундаменту якості та надійності полягає у визначенні того, які можливості приносять найбільшу цінність, та забезпеченні їх з достатньою послідовністю для інтеграції. Три категорії формують стовпи: інфраструктура спостережуваності, автоматизовані конвеєри валідації та контракти надійності.
Спостережуваність забезпечує інструментарій розподіленого додатку. Без наскрізної видимості поведінки системи, перемоги в надійності є пострілом у темряву. Платформа повинна поєднувати три стовпи спостережуваності: структуроване логування з використанням загальних схем полів, інструментарій метрик з використанням загальних бібліотек та розподілене трасування для відстеження запитів через межі сервісів.
Стандартизація також має значення. Якщо всі сервіси логують однаковий шаблон часових міток, поля ідентифікатора запиту та рівні серйозності, запити надійно працюють по всій системі. Коли метрики мають узгоджені конвенції іменування та загальні мітки, інформаційні панелі можуть змістовно агрегувати дані. Коли трасування послідовно поширює заголовки контексту, ви можете графічно відображати цілі потоки запитів незалежно від того, які сервіси задіяні.
Реалізація полягає в тому, щоб зробити інструментарій автоматичним там, де це має сенс. Обробка вручну призводить до непослідовності та прогалин. Платформа повинна поставлятися з бібліотеками та проміжним програмним забезпеченням, які за замовчуванням впроваджують спостережуваність. Сервери, бази даних та черги повинні автоматично інструментувати логи, затримку та трасування. Інженери мають повну спостережуваність без шаблонного коду.
Другою фундаментальною навичкою є автотестування з валідацією тестів через тестові конвеєри. Всі сервіси потребують кількох рівнів тестування, які слід запускати перед розгортанням у виробництво: модульні тести бізнес-логіки, інтеграційні тести компонентів та тести сумісності API. Платформа спрощує це, надаючи тестові фреймворки, хостингові тестові середовища та інтерфейси з системами CI/CD.
Тестова інфраструктура є вузьким місцем, коли нею керують спеціально. Сервіси вважають само собою зрозумілим, що бази даних, черги повідомлень та залежні сервіси працюють під час тестування. Ручне управління залежностями створює тестові набори, які є крихкими та часто виходять з ладу, і відбивають бажання багато тестувати. Платформа вирішила це, надаючи керовані тестові середовища, які автоматично забезпечують залежності, керують фікстурами даних та забезпечують ізоляцію між запусками.
Контрактне тестування особливо важливе в розподілених системах. Коли сервіси спілкуються один з одним через API, зміни, що порушують роботу в одному сервісі, можуть почати порушувати роботу споживачів. Контрактні тести гарантують, що постачальники продовжують відповідати очікуванням споживачів, виявляючи зміни, що порушують роботу, перед випуском. Платформа повинна спростити визначення контрактів, автоматично перевіряти контракти в CI та надавати явний зворотний зв'язок, коли контракти порушуються.
Третім стовпом є контракти надійності у вигляді SLO та бюджетів помилок. Вони перетворюють абстрактні цілі надійності на конкретну, відчутну форму. SLO обмежує хорошу поведінку в сервісі у формі цілі доступності або вимоги до затримки. Бюджет помилок - це зворотне: кількість збоїв, яку дозволено мати в межах SLO.
Переходи від концепції до операційної платформи вимагають пріоритетів у добрій вірі. Побудова всього заздалегідь гарантує пізню доставку та можливі інвестиції в можливості, які не є стратегічними. Майстерність полягає у встановленні пріоритетних областей високого впливу, де централізована інфраструктура може забезпечити короткострокову цінність, а потім ітерувати на основі фактичного використання.
Пріоритизація повинна базуватися на больових точках, а не на теоретичній повноті. Усвідомлення того, де команди страждають сьогодні, інформує їх про те, які області платформи будуть найбільш критичними. Загальні больові точки включають труднощі з налагодженням виробничих проблем через розпорошеність даних, неможливість тестування стабільним або чутливим способом та неможливість знати, чи буде розгортання безпечним. Це безпосередньо перекладається на пріоритети платформи: уніфікована спостережуваність, управління тестовою інфраструктурою та гарантія перед розгортанням.
Початковою навичкою, яку варто використати, зазвичай є уніфікація спостережуваності. Розміщення сервісів на спільному бекенді логування та метрик з уніфікованим інструментарієм негайно приносить дивіденди. Інженери можуть проглядати логи з усіх сервісів в одному місці, перехресно корелювати метрики між компонентами та бачити поведінку всієї системи. Налагодження набагато простіше, коли дані знаходяться в одному місці та в уніфікованому форматі.
Реалізація тут полягає в наданні посібників з міграції, бібліотек інструментарію та автоматизованих інструментів для конвертації операторів логування на місці в новий формат. Сервіси можна мігрувати поступово, а не великим вибухом. Під час переходу платформа повинна дозволяти співіснування старих і нових стилів, чітко документуючи шлях міграції та переваги.
Тестування інфраструктури природно слідує як друга ключова можливість. Спільна тестова інфраструктура з забезпеченням залежностей, управлінням фікстурами та очищенням знімає операційне навантаження з кожної команди. Вона також повинна мати можливість запускати локальну розробку та виконання CI, щоб усі були на одній сторінці, де інженери розробляють тести та де запускається автоматична валідація.
Фокус на початку повинен бути на загальних тестових випадках, які застосовуються до більшості сервісів: налаштування тестових баз даних з тестовими даними, заглушки для зовнішніх API-залежностей, перевірка API-контрактів та виконання інтеграційних тестів в ізоляції. Спеціальні вимоги до тестування та крайні випадки можна вирішити в наступних ітераціях. Достатньо добре зроблено раніше краще, ніж ідеально зроблено пізніше.
Централізація та свобода повинні бути збалансовані. Надмірна централізація придушує інновації та робить команди божевільними через спеціальні вимоги. Занадто багато гнучкості відкидає точку впливу платформи. Середина є хорошим значенням за замовчуванням з навмисними аварійними виходами. Платформа надає упереджені відповіді, які достатньо хороші для більшості випадків використання, але команди з дійсно спеціальними вимогами можуть вийти з окремих частин, все ще маючи можливість використовувати решту платформи.
Ранній успіх створює імпульс, який полегшує прийняття в майбутньому. Коли ранні команди бачать реальні здобутки в ефективності налагодження або гарантіях розгортання, інші спостерігають і турбуються. Платформа набуває легітимності через продемонстровану цінність знизу вгору, а не проголошену зверху вниз. Прийняття знизу вгору є здоровішим, ніж примусова міграція, оскільки команди вибирають використання платформи для певної вигоди.
\


