Перехід від JSON до Protobuf. Чи варто того?


23

У нас є REST веб-сервіси, які можуть обслуговувати XML або JSON (WCF). Я граю з ідеєю впровадження Protobufs. Чому?

ПРОС

  1. Менше завантаження на серверах.
  2. Менший розмір повідомлення - менше трафіку.
  3. Легше перемикатися зараз, ніж пізніше.

КОНС

  1. Потрібно реалізувати
  2. Складніше буде вирішувати проблеми / нюхати повідомлення для налагодження.
  3. Я можу включити GZip на сервері, і JSON буде споживати стільки ж трафіку

Яка ваша пропозиція та / або досвід щодо цього?


1
Я переглянув сторінку вікіпедії, і насправді було більше знаків на пару ключових значень, тож навіщо дозувати менше повідомлень?
Рамзі Кахіль

Через серіалізацію. Бінарні дані надходять у вигляді двійкових (наприклад, байтові масиви). Крім того, він не містить імен властивостей у повідомленні. Вони йдуть майновими ординалами. developers.google.com/protocol-buffers/docs/encoding#structure
katit

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

Відповіді:


39

Чи перевищує вартість бізнесу їх впровадження?

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

Тож значення перевищує це? Чи стикаєтеся ви з вибором "наші витрати на пропускну здатність становлять X% від наших доходів, і ми не можемо це підтримати"? Або навіть "нам потрібно витратити $ 20 000, щоб додати сервери для підтримки JSON"?

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


23

Я підтримую apis, і хтось до мене додав протобуф (тому що це було "швидше"). Єдине, що швидше - RTT через меншу корисну навантаження, і це можна виправити за допомогою gzipped JSON.

Частина, яка мені неприємна, - це відносна робота з підтримання протобуфа (порівняно з JSON). Я використовую Java, тому ми використовуємо відображення об'єктів Джексона для JSON. Додавання до відповіді означає додавання поля до POJO. Але для протобуфа я повинен змінити файл .proto, а потім оновити логіку серіалізації та десеріалізації, яка переміщує дані в буфери протоколів і в POJO. Не раз траплялося, що випуск траплявся, коли хтось додав поле і забув ввести або код серіалізації, або десеріалізацію для буферів протоколів.

Тепер, коли клієнти впроваджені проти буферів протоколів, від цього піти майже неможливо.

Ви можете, напевно, здогадатися з цього, моя порада - не робіть цього.


5
Якщо ви пишете (де) код серіалізації для переміщення даних у / з POJO, ви робите це неправильно. Просто використовуйте безпосередньо створені протобуфи класи.
Марсело Кантос

Я думаю, що в цьому випадку я переміщувався / виходив з POJO, тому що база даних підтримувала як запити / відповіді JSON, XML, так і протобуфи, і враховуючи, що я не можу додавати анотації Джексона та / або JAXB до генерованих протобуфами класів, і я хочу щоб використовувати однакові об’єкти моделі протягом усього коду, я не знаю, що у мене є варіанти просто використовувати створені класи. Я бачу, як це було б можливо зробити, якби я писав, скажімо, послуги GRPC, які розмовляють лише протобуфами.
Кевін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.