Інженерні команди досі витрачають цілі дні на суперечки про те, чи REST помер, чи gRPC зробив усе інше застарілим. Ця дискусія не вказує на суть проблеми. Ви обираєте не найкращий протокол. Ви обираєте правильну межу. Протокол, який ідеально працює всередині вашого кластера Kubernetes, почне «задихатися», коли ви передасте його тисячам зовнішніх розробників. Протокол, який економить дорогоцінну пропускну здатність вашого мобільного додатка, призведе до банкрутства вашої інфраструктури, якщо ви відкриєте його для довільних публічних запитів. Ставтеся до цього рішення як до конкурсу популярності технологій, і ви закріпите архітектурний борг, який переживе кожного нинішнього члена вашої команди.
Принцип межі
Архітектура — це про компроміси, а не про чемпіонів. Правильне запитання ніколи не звучить як «Який швидший?» або «Який новіший?». Воно звучить так: «Хто знаходиться на іншому кінці дроту і що вони контролюють?». Протоколи — це об'єкти межі. Вибір неправильного протоколу не просто сповільнює вас. Він закорінює помилки у вашій системі на роки.
Публічні API: REST — це не нудно, це відповідально
Коли вашим споживачем є зовнішній розробник, якого ви ніколи не зустрічали, ваш API є продуктом, а не просто інтерфейсом. Цей розробник займається налагодженням о другій годині ночі, маючи лише curl та колекцію Postman. Якщо йому доведеться встановлювати кастомну клієнтську бібліотеку або вивчати мову схем перед першим успішним викликом, ви вже його втратили.
REST виживає тут тому, що він і є самим вебом. HTTP-методи, коди статусів і JSON — це спільна мова. Кешування — це не другорядна функція, а вже наявна інфраструктура. Браузери, CDN та edge-кеші нативно розуміють заголовки Cache-Control та валідацію ETag. Ви можете розмістити REST API за стандартним CDN і миттєво заощадити на пропускній здатності, не написавши жодного рядка логіки кешування. Це має значення, коли публічний трафік непередбачуваний, а ви платите за кожен гігабайт, що покидає ваше хмарне сховище.
GraphQL, навпаки, створює значне навантаження на публічну межу. Публічні кінцеві точки GraphQL потребують аналізу вартості запитів, обмеження глибини та оцінки складності, щоб один необережний або зловмисний запит не знищив вашу базу даних. Ви не просто випускаєте API; ви будуєте рушій виконання запитів, стратегію обмеження частоти запитів (rate-limiting) та модель тарифікації обчислень. Якщо ви не маєте операційних потужностей найбільших платформ, такі витрат ресурсів є необачними для публічної поверхні. REST встановлює захисні бар'єри за замовчуванням. Кожна кінцева точка робить щось одне. Споживачі отримують саме те, що ви пропонуєте, а не те, що їм спадне на думку.
Внутрішні сервіси: Контролюйте весь шлях передачі даних
Всередині вашої організації розмова змінюється. Ви контролюєте і клієнта, і сервер. Ви можете диктувати технологічний стек для кожного сервісу в ланцюжку викликів. Саме тут gRPC виправдовує себе.
По-перше, припиніть ставитися до JSON як до чогось священного. Protocol Buffers серіалізують дані приблизно втричі швидше за JSON. Корисне навантаження менше, оскільки формат є бінарним. У завантаженій внутрішній мережі ці мілісекунди та мегабайти перетворюються на реальні гроші та знижують хвостову затримку (tail latency). Що ще важливіше, Protobuf забезпечує суворий контракт. Коли ви змінюєте тип поля або перейменовуєте повідомлення, помилка виникає під час компіляції, а не о третій годині ночі в продакшені, коли наступний сервіс починає викидати винятки парсингу.
gRPC працює поверх HTTP/2, тому ви отримуєте стиснення заголовків, мультиплексовані потоки та справжню семантику стрімінгу. Якщо ви передаєте високопродуктивні події між сервісами або надсилаєте оновлення в реальному часі, серверний та двосторонній стрімінг є нативними функціями, а не обхідними шляхами на кшталт long-polling, «приклеєними» до фреймворку запит-відповідь.
Є один важливий нюанс: не спрямовуйте gRPC безпосередньо в браузер. Мережеві моделі браузерів не працюють з HTTP/2 так, як того очікує gRPC. Ви закінчите тим, що прикріпите grpc-web та проксі на кшталт Envoy до свого стека лише для того, щоб браузер міг поспілкуватися з бекендом. Це не баг, це сигнал межі. Тримайте gRPC за своїм фаєрволом, між сервісами, які довіряють один одному, і сприймайте складність його налагодження як ціну за швидкість. Бінарні дані не так зручно переглядати в лог-файлах, як JSON.
Складні інтерфейси та мобільні пристрої: ніша GraphQL
Сучасні мобільні екрани — це мозаїка. Одній сторінці може знадобитися профіль користувача,
