Експертиза · Складні архітектури
Кілька систем, які мають працювати разом, зокрема коли одна з них падає.
Ми проєктуємо та експлуатуємо платформи з кількох сервісів, із message bus, обмеженими retry, idempotency keys, circuit breakers і публікацією з автоматичним відкатом. Кожен шаблон нижче працює в окремій системі, а не в діаграмі.
Вже збудованоМи експлуатуємо чотири власні платформи з різними архітектурами й можемо відкрити всі. Цифри виміряні сьогодні командами, а не взяті з документації: aichat має 28 службових каталогів, 235 моделей даних на чотирьох схемах і шину повідомлень із 297 чергами та 17.525 зв’язками; Kallina має 472 edge-функції, 559 міграцій і 28 запланованих завдань у базі; MEGA CRM має backend на 9.516 рядків із 99 маршрутами та 179 політиками доступу в рядку; Taskin виконує 21 заплановане завдання без жодного Docker. Застереження, яке ми говоримо: у двох місцях власна документація відстала від коду — твердження про кількість рядків було застарілим на 16%, а діаграма інфраструктури описувала сервер, на якому ми вже нічого не запускаємо. Ми використали вимірювання, а не документ.
«Складна архітектура» не означає багато коробок на кресленні. Це означає, що ви знаєте, що станеться, коли одна з них не відповість. Система з трьома сервісами, які викликають один одного синхронно, без ліміту повторних спроб і без idempotence, крихкіша за моноліт — тому що кожен новий зв’язок є новим способом збою, а способи збою множаться швидше, ніж функціональності.
Наша робота починається з розділення відповідальностей і завершується там, де видно, коли щось ламається. В одній із власних платформ повідомлення не переходять прямо між сервісами, а проходять через шину з 297 чергами, 9 обмінниками і 17.525 зв’язками, з яких 278 черг генеруються на клієнта, а не пишуться вручну. Вісім черг мають dead-letter exchange, а вісім — час життя повідомлення п’ять хвилин — тобто повідомлення, яке не може бути оброблене, потрапляє туди, де його можна побачити, а не зникає.
Шаблони, які ми застосовуємо, небагато і вони повторюються: повторні спроби з лімітом, записаним у коді, idempotence-ключі, які роблять повторну доставку тієї самої події нешкідливою, вимикач, що зупиняє виклики до сервісу, який регулярно падає, gate споживання перед діями, які коштують грошей, і алерти з порогом повторення, щоб інтермітентна несправність не поховала решту.
Остання частина, яка важлива: публікація. Одна з платформ публікується через синхронізацію файлів, без Docker, з перевіркою, що сторінка, яку обслуговують, містить саме ідентифікатор пакета, щойно опублікованого — не лише те, що сервер відповідає 200 — і з автоматичним поверненням до попередньої версії, якщо перевірка не проходить. Правило з’явилося після реального інциденту, у якому поверхнева перевірка скасувала вдалу публікацію.