protobuf проти gRPC


102

Я намагаюся зрозуміти protobuf та gRPC та те, як я можу використовувати обидва. Не могли б ви допомогти мені зрозуміти наступне:

  • Беручи до уваги модель OSI , де де, наприклад, знаходиться Protobuf на рівні 4?
  • Думаючи через передачу повідомлень, як відбувається "потік", що gRPC робить те, чого пропускає protobuf?
  • Якщо відправник використовує protobuf, чи може сервер використовувати gRPC або gRPC додає щось, що може доставити лише клієнт gRPC?
  • Якщо gRPC може зробити синхронний та асинхронний зв’язок можливим, Protobuf призначений лише для маршалінгу, і тому не має нічого спільного із станом - true або false?
  • Чи можу я використовувати gRPC у фронтенд-програмі, що спілкується замість REST або GraphQL?

Я вже знаю - або припускаю, що знаю - що:

Протобуф

  • Двійковий протокол для обміну даними
  • Розроблено Google
  • Використовує згенеровану "Структуру", як опис на клієнті та сервері, для повідомлення un - / - marshall

gRPC

  • Використовує protobuf (v3)
  • Знову від Google
  • Рамка для викликів RPC
  • Також використовує HTTP / 2
  • Можливе синхронне та асинхронне спілкування

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

Відповіді:


85

Буфери протоколів - це (є?) Мова визначення інтерфейсу та бібліотека серіалізації:

  • Ви визначаєте свої структури даних в його IDL, тобто описуєте об'єкти даних, які ви хочете використовувати
  • Він забезпечує процедури перекладу ваших об'єктів даних у бінарні файли та з них, наприклад для запису / читання даних з диска

gRPC використовує той самий IDL, але додає синтаксис "rpc", що дозволяє визначати сигнатури методу віддаленого виклику процедур, використовуючи структури даних Protobuf як типи даних:

  • Ви визначаєте свої структури даних
  • Ви додаєте визначення методу rpc
  • Він надає код для обслуговування та виклику підписів методу через мережу
  • Ви все ще можете серіалізувати об’єкти даних вручну за допомогою Protobuf, якщо вам це потрібно

Відповідаючи на запитання:

  1. gRPC працює на рівнях 5, 6 і 7. Protobuf працює на рівні 6.
  2. Коли ви говорите "передача повідомлення", Protobuf не стосується самої передачі. Він працює лише в будь-якому кінці будь-якої передачі даних, перетворюючи байти в об'єкти
  3. Використання gRPC за замовчуванням означає, що ви використовуєте Protobuf . Ви можете написати власного клієнта, який використовує Protobuf, але не gRPC, щоб взаємодіяти з gRPC, або підключити інші серіалізатори до gRPC - але використання gRPC було б простіше
  4. Правда
  5. так, ти можеш

Скажіть, будь ласка, про які «шари» ви, люди, говорите? Будь ласка, дайте мені посилання, щоб детально зрозуміти цю концепцію. Дякую.
— Міллі Хадсон,

Його модель OSI - додано посилання у запитання. Спірно, чи належить gRPC на рівнях 5 і 6, оскільки він використовує протокол рівня 7 ( HTTP/2), але він безумовно виконує завдання цих шарів.
— Пітер Вішарт,

67

Насправді gRPC та Protobuf - це 2 абсолютно різні речі. Дозвольте спростити:

  • gRPC керує способом взаємодії клієнта та сервера (як веб-клієнт / сервер з REST API)
  • protobuf - це просто інструмент серіалізації / десеріалізації (як і JSON)

gRPC має 2 сторони: серверну та клієнтську, які можуть набирати номер на сервері. Сервер надає RPC (тобто функції, які можна викликати віддалено). І у вас є безліч варіантів: ви можете захистити зв'язок (за допомогою TLS), додати рівень автентифікації (за допомогою перехоплювачів), ...

Ви можете використовувати protobuf всередині будь-якої програми, яка не має потреби бути клієнтом / сервером. Якщо вам потрібно обмінятись даними та хочете, щоб вони були сильно набрані, protobuf - хороший варіант (швидкий та надійний).

З огляду на це, ви можете поєднати як для створення приємної системи клієнт / сервер: gRPC буде вашим кодом клієнта / сервера, так і protobuf вашого протоколу даних.

PS: Я написав цю статтю, щоб показати, як можна побудувати клієнт / сервер за допомогою gRPC та protobuf, використовуючи Go, поетапно.


3
Дякую, це допомагає мені впровадити зразок.
— самотній

7

grpc - це фреймворк, побудований Google, і він використовується у виробничих проектах від самого Google, а #HyperledgerFabric побудований за допомогою grpc. Існує багато програм із відкритим кодом, побудованих за допомогою grpc

protobuff - це представлення даних, як json, це також Google, адже вони мають кілька тисяч прото-файлів, що генеруються у їхніх виробничих проектах

grpc

  • gRPC - це фреймворк з відкритим кодом, розроблений Google
  • Це дозволяє нам створювати запит і відповідь на RPC і обробляти відпочинок за допомогою фреймворку
  • REST орієнтований на CRUD, але grpc орієнтований на API (без обмежень)
  • Побудуйте поверх HTTP / 2
  • Забезпечує >>>>> Авторизацію, збалансування навантаження, моніторинг, реєстрацію
  • [HTTP / 2]
    • HTTP1.1 вийшов у 1997 році дуже давно
    • HTTP1 відкриває нове TCP-з'єднання з сервером при кожному запиті
    • Він не стискає заголовки
    • БЕЗ натискання сервера, він просто працює з Req, Res
    • HTTP2, випущений в 2015 році (SPDY)
    • Підтримує мультиплексування
    • клієнт і сервер можуть паралельно надсилати повідомлення через одне і те ж з'єднання TCP
    • Значно зменшує затримку
    • HTTP2 підтримує стиснення заголовка
    • HTTP2 є двійковим
      • proto buff є двійковим, тому він чудово підходить для HTTP2
  • [ТИПИ]
    • Одинарний
    • клієнтська потокова передача
    • серверне потокове передавання
    • Двоспрямоване потокове передавання
    • Сервери grpc за замовчуванням є Async
    • Клієнти grpc можуть бути синхронізованими або асинхронними

протобуфф

  • Буфери протоколів є агностичними для мови
  • Розбір буферів протоколів (двійковий формат) є менш інтенсивним процесором
  • [Найменування]
    • Для імен повідомлень використовуйте чохол для верблюда
    • підкреслення_відділено для полів
    • Використовуйте верблюд для Enums і CAPITAL_WITH_UNDERSCORE для імен значень
  • [Коментарі]
    • Підтримка //
    • Підтримка / * * /
  • [Переваги]
    • Дані повністю набрано
    • Дані повністю стискаються (менше використання пропускної здатності)
    • Схема (повідомлення) потрібна для генерації коду та зчитування коду
    • Документація може бути вбудована в схему
    • Дані можна читати будь-якою мовою
    • Схема може розвиватися в будь-який час безпечним чином
    • швидше, ніж XML
    • код генерується для вас автоматично
    • Google винайшов proto buff, вони використовують 48000 повідомлень protobuf та файли 12000.proto
    • Багато RPC-фреймворків, включаючи grpc, використовують буфери протоколів для обміну даними

3
Стиснення НЕ зменшує використання процесора. Вам потрібно стиснути і розпакувати його, щоб надіслати або використовувати дані в серіалізації, що спалює процесор, роблячи це. Що стиснення робить для вас, це зменшення серіалізованого розміру, зменшення потенційного тиску пам'яті, використання диска, якщо використовується для серіалізації на диск, або більше дротова сигналізація.
— Свартальф

@Svartalf редагував, щоб виправити це. Дякуємо, що вказали на це!
— swrobel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.