Aller au contenu principal
Retour au blogue

Développement logiciel

Optimisation de la communication avec Protobuf et gRPC

Daehli Nadeau
16 août 2023 ∙ 6 mins
Développeur web au travail dans nos bureaux de Montréal

Introduction

Dans le monde en constante évolution du développement logiciel d'aujourd'hui, une communication efficace et transparente entre différents systèmes et services revêt une grande importance. Protobuf (Protocol Buffers) et gRPC se sont imposés comme des technologies puissantes qui répondent aux défis liés à la communication entre services. En tant qu'entreprise de conseil, il est crucial pour nous de rester à la pointe de la technologie et de nous assurer que ces technologies sont suffisamment matures pour une utilisation en production.

L'une des principales raisons pour lesquelles nous utilisons gRPC est son efficacité dans la facilitation de la communication entre services. Avec des projets de plus en plus complexes qui dépassent le cadre des applications de services web, il devient essentiel de disposer d'un moyen fiable de communication. Comme vous le savez probablement, l'un de nos projets est Spot. En interne, Spot utilise Protobuf pour communiquer avec d'autres composants. Cela permet un échange de données fluide et efficace au sein du système.

Une autre raison pour laquelle nous avons commencé à travailler avec Protobuf et gRPC est la nature des projets sur lesquels nous travaillons. Par exemple, les projets impliquant la vision par ordinateur peuvent réduire leur latence lorsqu'ils utilisent gRPC. Les projets impliquant des appareils IoT sont également d'excellents exemples de domaines où nous pouvons réduire la latence et la taille des paquets.

Sans plus tarder, je vais vous présenter certains aspects clés de ces deux technologies.

Protobuf

Protobuf (Protocol Buffers) logo

Protobuf, c'est quoi au juste?

Protobuf est un format de sérialisation de données agnostique au langage développé par Google. Il permet une sérialisation, une désérialisation et une transmission efficaces de données structurées. Avec Protobuf, les développeurs définissent la structure des données à l'aide d'un langage d'interface de définition agnostique au langage (IDL). Cette définition sert de contrat entre différents services, garantissant une communication transparente. Cela signifie que l'expéditeur peut utiliser un langage fortement typé comme .NET C#, tandis que le destinataire peut travailler avec JavaScript, sans avoir besoin de connaître les langages de programmation de l'autre.

Compacité et Efficacité

Protobuf utilise un format binaire qui est très compact et efficace par rapport aux formats traditionnels basés sur du texte tels que XML et JSON. La compacité de Protobuf entraîne une réduction de l'utilisation de la bande passante du réseau et des tailles de messages plus petites, ce qui se traduit par une transmission plus rapide et une réduction du stockage.

Versions et Compatibilité

Maintenir la compatibilité entre différentes versions de logiciels peut être une tâche complexe. Cependant, Protobuf adresse cette problématique en permettant aux développeurs de faire évoluer leur schéma de données sans rompre les systèmes existants. De nouveaux champs peuvent être ajoutés et d'anciens champs peuvent être dépréciés sans affecter la compatibilité des systèmes. Cette flexibilité fait de Protobuf un choix idéal pour les projets qui nécessitent une évolution à long terme des données et une compatibilité ascendante transparente.

Support des Langages

Protobuf prend en charge une large gamme de langages de programmation, dont, mais sans s'y limiter, C++, Java, Python, Go et C#. Ce support linguistique étendu garantit que les développeurs peuvent intégrer Protobuf de manière transparente dans leur pile technologique existante, quel que soit le langage utilisé pour le développement.

gRPC

gRPC (Remote Procedure Call) logo

gRPC c'est quoi?

S'appuyant sur Protobuf, gRPC est un framework open source également développé par Google. Il exploite la sérialisation efficace des données de Protobuf pour permettre une communication inter-services rapide et fiable. La communication inter-services peut être une architecture client-serveur ou une configuration plus complexe, comme celle de Spot avec ses différents modules. Prenons un exemple concret avec Spot : le processus de transmission des données de la caméra depuis Spot. gRPC prend en charge le streaming unidirectionnel et le streaming bidirectionnel. C'est un bon choix pour tous les appareils IoT connectés.

Appels de Procédure à Distance Haute Performance

gRPC fournit un mécanisme d'appel de procédure à distance (RPC) efficace et performant en exploitant Protobuf. Il offre un streaming bidirectionnel, permettant aux clients et aux serveurs d'envoyer et de recevoir plusieurs messages de manière asynchrone. Cette capacité est particulièrement avantageuse dans les scénarios où l'échange de données en temps réel (objet IoT) et la communication continue sont nécessaires.

Pour comprendre le streaming bidirectionnel, imaginons une conversation entre deux personnes, Alice et Bob. Ils utilisent des talkies-walkies pour communiquer. Normalement, lorsqu'une personne parle, l'autre écoute, et vice versa. Cela ressemble à une communication traditionnelle de type requête-réponse, où un côté envoie un message et attend une réponse avant d'envoyer un autre message.

Cependant, avec le streaming bidirectionnel, Alice et Bob peuvent à la fois parler et écouter. Ils peuvent avoir une conversation en aller-retour, échanger des messages sans avoir à attendre que l'autre ait fini de parler. Cela leur permet d'avoir une communication en temps réel, similaire à un chat en direct ou à un appel téléphonique.

Exemples de gRPC

Commençons par définir un fichier proto. L'extension .proto est utilisée pour définir le langage Protobuf. Dans le fichier proto, vous définissez la structure des messages qui seront échangés entre le client et le serveur. Un message représente une unité de données qui doit être sérialisée (convertie en format binaire) lorsqu'elle est envoyée sur le « fil » et désérialisée (convertie en sa forme d'origine) lors de sa réception. Les messages peuvent contenir des champs de différents types, tels que des chaînes de caractères, des entiers, des booléens, voire des types de messages imbriqués.

Voyager Wires

message CreateTodo {
  string task = 4;
  optional google.protobuf.Timestamp due = 3;
}
message Todo {
  int32 id = 1;
  bool complete = 2;
  optional google.protobuf.Timestamp due = 3;
  string task = 4;
}
message TodoId {
  int32 id = 1;
}

Dans l'exemple ci-dessus, j'ai créé 3 messages. Le premier message sert à créer la tâche Todo, le suivant est l'objet complet de la tâche Todo et le dernier est le message pour récupérer une tâche en fonction d'un ID. Sans un service, nous ne pouvons pas utiliser ces messages. Créons donc quelques services gRPC dans le même fichier proto.

service TodoService {
  rpc Create (CreateTodo) returns (Todo) {}

  rpc Get(TodoId) returns (Todo) {}
}

Dans l'exemple ci-dessus, on définit 2 services gRCP. Vous pouvez voir les services RPC comme un « endpoint » dans le monde REST. Mais RPC et REST sont un peu différents

Et maintenant, voici où la magie opère. Protobuf et gRPC possèdent des binaires qui peuvent être utilisés pour créer du code dans différentes langues. Par exemple, j'utiliserai Python pour générer le code des messages définis ci-dessus et des services gRPC.

python -m grpc_tools.protoc -Iproto \\
  --python_out=api/grpc/ \\
  --pyi_out=api/grpc \\
  --grpc_python_out=api/grpc \\
  proto/todos.proto
  • Dans l'interface de ligne de commande (CLI) ci-dessus, j'utilise Python avec le binaire grpctools pour générer le message proto avec les options `--pythonout`.
  • J'ai également créé l'interface Python pour définir des fonctions que je peux substituer pour rendre un objet appelable. J'ai utilisé l'option --pyi_out pour générer ce fichier d'interface.
  • Enfin, j'ai utilisé l'option grpc_python_out pour avoir le code gRPC pour interagir avec la fonction gRPC. Le dernier argument de l'interface de ligne de commande est le chemin vers le fichier proto.

Conclusion

Protobuf et gRPC sont devenues des technologies incontournables pour le développement logiciel moderne en raison de leurs nombreux avantages. La compacité et l'efficacité de Protobuf contribuent considérablement à l'optimisation des besoins de transmission et de stockage des données, tout en garantissant la viabilité à long terme grâce à ses fonctionnalités de versionnage et de compatibilité. De plus, gRPC s'appuie sur Protobuf pour fournir un mécanisme RPC haute performance, permettant une communication inter-services rapide et fiable.

La nature indépendante du langage de Protobuf permet aux développeurs de travailler de manière transparente dans plusieurs langages de programmation, facilitant ainsi l'intégration de ces technologies dans les écosystèmes logiciels existants. Avec leur puissance combinée, Protobuf et gRPC permettent aux développeurs de logiciels de concevoir des systèmes distribués évolutifs et efficaces.

À mesure que la demande de systèmes hautement performants et interopérables continue de croître, Protobuf et gRPC offrent une base fiable pour la création de canaux de communication dans plusieurs langages et architectures. En adoptant ces technologies, les développeurs peuvent libérer le potentiel de transfert de données rationalisé et efficace, conduisant finalement à des applications robustes et évolutives.

Pour toutes les raisons mentionnées ci-dessus, Osedea encouragera l'utilisation de Protobuf et de gRPC dans les projets futurs.

Créons quelque chose
d'extraordinaire ensemble.