Passez de JSON à Protobuf. Est-ce que ça vaut le coup?

23

Nous avons des services Web REST qui peuvent servir XML ou JSON (WCF). Je joue avec l'idée d'implémenter Protobufs. Pourquoi?

AVANTAGES

  1. Moins de charge sur les serveurs.
  2. Taille de message plus petite - moins de trafic.
  3. Il est plus facile de changer maintenant que plus tard.

LES INCONVÉNIENTS

  1. Besoin d'être mis en œuvre
  2. Va être plus difficile de dépanner / renifler des messages pour le débogage.
  3. Je peux activer GZip sur le serveur et JSON consommera autant de trafic

Quelle est votre suggestion et / ou expérience à ce sujet?

Katit
la source
1
J'ai regardé la page wikipedia, et il y avait en fait plus de caractères par paire clé-valeur, alors pourquoi la dose a-t-elle des messages plus petits?
Ramzi Kahil
En raison de la sérialisation. Les données binaires sont transmises sous forme binaire (tableaux d'octets par exemple). De plus, il ne porte pas de noms de propriété dans un message. Ils passent par des ordinaux de propriété. developers.google.com/protocol-buffers/docs/encoding#structure
katit
10
Techniquement, vous avez répondu à votre propre question, compressez le JSON et terminez. Plus important encore, vous ne mentionnez jamais une analyse de rentabilisation réelle pour dépenser de l'argent et du temps pour cette activité.

Réponses:

39

La valeur commerciale de leur mise en œuvre dépasse-t-elle le coût?

Si vous implémentez, vous devez changer non seulement votre serveur, mais tous les clients (bien que vous puissiez prendre en charge les deux formats et ne changer les clients que si nécessaire). Cela prendra du temps et des tests, ce qui est un coût direct. Et ne sous-estimez pas le temps nécessaire pour vraiment comprendre les tampons de protocole (en particulier les raisons de rendre le champ obligatoire ou facultatif), ni le temps nécessaire pour intégrer le compilateur protobuf dans votre processus de génération.

La valeur dépasse-t-elle donc cela? Êtes-vous confronté à un choix de "nos coûts de bande passante représentent X% de nos revenus et nous ne pouvons pas les prendre en charge"? Ou même "nous devons dépenser 20 000 $ pour ajouter des serveurs pour prendre en charge JSON"?

À moins que vous n'ayez un besoin commercial pressant, vos «pros» ne sont pas vraiment des pros, juste une optimisation prématurée.

parsifal
la source
23

je maintiens apis et quelqu'un avant moi a ajouté protobuf (parce que c'était "plus rapide"). La seule chose plus rapide est RTT en raison de la charge utile plus petite, et cela peut être corrigé avec JSON gzippé.

La partie qui me déplaît est le travail relatif pour maintenir protobuf (par rapport à JSON). J'utilise java donc nous utilisons le mappage d'objets Jackson pour JSON. Ajouter à une réponse signifie ajouter un champ à un POJO. Mais pour protobuf, je dois modifier le fichier .proto, puis mettre à jour la logique de sérialisation et de désérialisation qui déplace les données dans / hors des tampons de protocole et dans les POJO. Il est arrivé plus d'une fois qu'une version s'est produite où quelqu'un a ajouté un champ et a oublié de mettre le code de sérialisation ou de désérialisation pour les tampons de protocole.

Maintenant que les clients ont implémenté les tampons de protocole, il est presque impossible de s'en éloigner.

Vous pouvez probablement deviner à partir de cela, mon conseil est de ne pas le faire.

Kevin
la source
5
Si vous écrivez du code de (dé) sérialisation pour déplacer des données vers / depuis des POJO, vous vous trompez. Utilisez directement les classes générées par protobuf.
Marcelo Cantos
Je pense que dans ce cas, je me déplaçais dans / hors des POJO parce que la base de code supportait les requêtes / réponses JSON, XML et Protobuf, et étant donné que je ne pouvais pas ajouter d'annotations Jackson et / ou JAXB aux classes générées par protobuf, et je veux pour utiliser les mêmes objets de modèle dans tout le code, je ne sais pas si j'ai des options pour simplement utiliser les classes générées. Je peux voir comment cela serait possible si j'écrivais des services GRPC qui ne parlent que de protobuf.
Kevin