/ / Quels sont les inconvénients pratiques de l'utilisationformat d'échange de données fortement typé (par exemple proto d'épargne / capn) dans un contexte de microservices? - json, sérialisation, économie, microservices, échange de données

Quels sont les inconvénients pratiques de l’utilisation d’un format d’échange de données fortement typé (par exemple, thrift / capn proto) dans un contexte de microservices? - json, sérialisation, économie, microservices, échange de données

Je pense introduire un style fortement typé(lecture - avec schéma prédéfini) format d'échange de données pour la communication entre nos services internes. Par exemple, je suppose quelque chose comme Thrift ou Cap "n Proto.

Au moins deux avantages évidents (pour moi) d'utiliser cela par rapport à quelque chose comme JSON est que

  1. vous SAVEZ le format exact des données auxquelles le service peut s'attendre (donc laisse moins de place à l'ambiguïté et aux erreurs lors de la communication) et
  2. l'implémentation désérialise généralement le message brut pour vous et fournit des méthodes pour accéder aux objets.

Quels sont les inconvénients pratiques pour emprunter cette voie, par rapport à quelque chose comme JSON?

Pour le contexte - notre système se compose de servicesécrit en python et java - et peut-être d'autres langues à l'avenir, et communique via des points de terminaison HTTP entre les services et les courtiers de messages comme rabbitmq.

Réponses:

0 pour la réponse № 1

Comme pour tout système fortement typé, l'un des principaux avantages est sans aucun doute que si vous faites des erreurs, il échoue tôt dans le processus, généralement au stade de la compilation, ce qui est une bonne chose.

Le deuxième plus grand avantage à mon humble avis est ce que vous avez déjàa déclaré: parce que les champs et les types sont bien connus, le compilateur, les bibliothèques et le code associé savent à quelles données s'attendre et peuvent donc être écrits / organisés de manière plus efficace - ou en bref: performance.

En revanche, un système typé losely (comme Avro), tout en permettant beaucoup plus la flexibilité sans avoir besoin de recompiler, vient avec l'autre côté de la même pièce: l'inconvénient d'être sujet à des erreurs concernant le contenu du message lors de l'exécution.

En effet, un système mal défini définituniquement la syntaxe d'un document valide (comme par exemple XML) et laisse la sémantique au niveau du message de ce qui est dans le document aux couches supérieures. Un système fortement typé a la connaissance de la sémantique au niveau du message déjà intégrée au moment de la compilation. Par conséquent, il est facile de détecter / décider siun document ou un message particulier est non seulement bien formé, mais valide en ce qui concerne le contenu du message. Si vous devez faire de même avec le système mal défini, vous devez fournir des informations supplémentaires à l'exécution (comme le schéma XML) et validez votre document par rapport à celui-ci.

Ligne de fond

Quel système vous préférez est plus ou moins une questionde goût dans la plupart des cas. Je "prendrais la décision sur la base de la question, à quel point les données sont variables avec lesquelles je dois traiter. sur les erreurs et les erreurs au début.

Cependant, s'il existe un besoin destructures de données, il peut être plus judicieux d'aller dans l'autre sens. Bien que la conception d'un schéma typé losely sur un système fortement typé soit sûrement possible, c'est quelque peu contradictoire et vous vous retrouverez avec quelque chose de trop compliqué, bien que trop générique.


0 pour la réponse № 2

Dactylographié

Les messages entrants dont le type est balisé sont trèslibérant, tant qu'il est possible de dire ce qu'est le message entrant sans le lire entièrement. Si c'est le cas, vous ne vous souciez plus tant de l'ordre des messages. En effet, il est facile pour le destinataire des messages de gérer quoi qu'il soit envoyé. Vous pouvez donc avoir une application qui se trouve juste là, prenant tout ce qu'elle obtient, et fait tout ce qui est approprié pour chacun.

Format

Un langage de schéma qui vous permet de définir la valeuret les contraintes de taille sont très utiles. Cela signifie que l'expéditeur d'un message ne peut pas envoyer accidentellement un message non valide. De plus, le récepteur peut automatiquement dire si un message entrant répond au schéma. C'est un vrai bonus dans la mise en place d'un service réseau; la majeure partie de la validation du message est faite pour vous!

Par contrainte de taille, je veux dire que vous pouvez spécifiercombien de temps un tableau est dans le schéma et le code généré refusera de gérer les tableaux plus ou moins longtemps. Par des contraintes de valeur, imaginez un champ de message appelé "portant"; vous voudrez peut-être limiter cela entre 0 et 359.

Ces deux éléments vous permettent de faire une déclaration claire et sans ambiguïtédéclaration sur ce qu'est l'interface et la faire appliquer automatiquement. Combien de bugs de sécurité y a-t-il eu récemment où une certaine validation des données d'interface réseau a été mal implémentée ...

Les options

Une norme de sérialisation qui fait tout cela estASN.1. Les outils que j'ai utilisés prennent un schéma ASN.1 et produisent du code pour sérialiser et désérialiser, vérifiant automatiquement que les contraintes de valeur et de taille ont été respectées et vous indiquant également ce qu'est un type de message entrant. Les outils pour ASN.1 peuvent être assez vieux et ont besoin d'être mis à jour.

Il existe également des schémas JSON, et ils semblent avoir des contraintes de type, de valeur et de taille. C'est peut-être ce que vous recherchez.

Je suis assez sûr que les tampons de protocole Google ne font pas très bien le balisage de type et ne font pas de contraintes de valeur et de taille. J'ai vu des commentaires dans le schéma GPB le long des lignes de:

// ne doit pas être supérieur à 10.

Si c'est ce qui est écrit dans un schéma, le langage du schéma est sans doute inadéquat ...

Je ne suis pas sûr de Thrift, je ne suis pas sûr qu'il respecte les contraintes de valeur (quelqu'un me corrige si je me trompe, s'il vous plaît!).

Désavantages

Je ne peux pas y penser! Cela peut irriter les développeurs; le code qu'ils jugeaient bon peut être facilement révélé comme produisant des messages indésirables, ce qui les ennuie intensément ...