đ Dans la jungle des IPCs
Introduction
Dans les programmes informatiques, les IPCs sont partout et de types trĂšs divers.
Pour rappel, il s’agit lĂ de diverses technologies qui permettent Ă plusieurs processus de communiquer entre deux (comprendre : se partager des donnĂ©es).
Il y a, Ă mon sens 2 niveaux d’IPCs :
- Les IPCs “bas niveau”, implĂ©mentĂ© par le kernel :
- implémente des fonctionnalités simples.
- peu abstrait (besoin de dĂ©finir la taille de l’espace allouĂ© dans le cas d’un segment de mĂ©moire partagĂ© par exemple).
- Sous linux, on à notamment :
- Tube(pipe)
- Fichier
- Socket (utilisé pour le réseau notamment)
- Signaux (plutĂŽt utilisĂ© pour agir sur l’Ă©tat du service, sens standardisĂ©)
- Segment de mémoire partagée
- des mécanismes de synchronisations : ex : les semaphores.
- Les IPCs “haut niveau” :
- Basé sur les IPC bas niveau (trÚs souvent les sockets).
- Plus abstraits.
- Ajoute de diverses garanties selon les technologies, par exemple :
- bonne récéption des données.
- validation d’un format des donnĂ©es.
- récéption synchrone (RPC) ou asynchrone (mq)
- diverse paradigme de communication (Stream, PubSub), etc.
- Logique unidirectionnelle, bidirectionnelle ou encore vers n récepteurs.
Si l’on comprend les IPC “haut-niveau”, les technologies de communications entre processus sont trĂšs nombreuses et il n’est pas toujours si simple de savoir quoi utiliser, ce qui abouti dans de nombreux cas Ă utiliser les technologies connu plutĂŽt qu’une Ă©ventuelle meilleure technologie pour le cas d’usage.
Bref, j’avais du temps Ă perdre et j’ai donc rĂ©alisĂ© un petit programme nommĂ© Universal Ping, ou j’ai testĂ© plus des dizaines d’IPC avec ces contraintes :
- Langage Python
- Communication simple type “RPC”:
- Appel “Ping” avec variable de nombre “n”
- Retour “n” fois “Pong⊔
J’en ai profitĂ© pour essayer de clarifier dans ma tĂȘte tout cela. Voici donc ma façon, sous forme d’arbres de dĂ©cisions de prĂ©senter la diversitĂ© des ces IPCs :
Quel IPC Choisir ?
J’ai organisĂ© les IPCs autour d’un point qui me semble assez important : L’IPC fournit-elle une API ? Et si oui, est-elle prĂ©vu pour ĂȘtre utilisĂ© publiquement (comprendre par des programmes totalement extĂ©rieurs sans difficultĂ©s).
J’ai donc sĂ©parĂ© les IPC en trois catĂ©gories :
- Les IPCs conçu pour fournir une API “publique” explicite.
- Les IPCs conçu pour fournir une API “privĂ©e” explicite (plutĂŽt conçu pour une application en plusieurs parties).
- Les IPCs sans support intĂ©grĂ© de mĂ©canisme d’API.
Note : Il s’agit lĂ d’une organisation
subjective. Bien Ă©videmment, il est toujours tout Ă fait possible d’utilisĂ© une IPC sans mĂ©canisme d’API et d’ajouter une documentation d’une API et/ou un sur-couche logicielle qui gĂšrerait l’API, mais cela sera moins “standard” qu’une technologie qui est conçue dans ce but.
API Publique
Si je veux concevoir un logiciel sur lequel d’autres logiciels peuvent se brancher, c’est vers ces solutions que je me tournerais :
API Privée
Si je devais faire un logiciel “en plusieurs parties”, ces solutions sont Ă©lĂ©gantes :
L’aspect API est particuliĂšrement intĂ©ressant si vous voulez travailler Ă plusieurs sur diffĂ©rente partie sans vous marcher dessus.
Les autres IPCs
Ces technos requiĂšrent une clarification d’API entre les diffĂ©rents processus utilisant la technologie pour ĂȘtre utilisĂ© convenablement. Cependant, elles sont pour beaucoup simple d’accĂšs et n’ont pas forcĂ©ment les mĂȘmes avantages que les technologies prĂ©cĂ©dentes, je pense en particulier :
- L’aspect
stockagedes BDD - L’aspect
asynchronedes Messages Queue.
Certaines ont aussi des cas d’usage trĂšs dĂ©fini et sont quasi-imbattable dans ce cadre prĂ©cis, je pense en particulier Ă
MQTT pour des capteurs. L’absence d’API clarifiĂ© n’est pas forcĂ©ment un gros soucis notamment ll est trĂšs facile de regarder le flux avec un outil comme MqttExplorer et
que les avantages du protocole surpassent cet inconvĂ©nient mineur pour ce cas d’usage.
Mon avis ?
En faisant ce petit test de divers IPC, il y a clairement des technologies que j’apprĂ©cie plus que d’autres :
-
IPC trop complexe à mon goût (besoin trÚs particulier, gros projet, usage legacy) :
- IPC bas niveau : Amusant jusqu’au moment ou il faut rĂ©implĂ©menter les fonctionnalitĂ© d’un ZMQ.
- GRPC/Thrift: Je trouve l’intĂ©gration dans Python, en particulier de GRPC trĂšs lourde.
- RabbitMQ (et probablement Kafka) : Le code python pour mon petit RPC m’a paru inutilement compliquĂ©.
-
Standard de fait :
- OpenAPI, Rest : Pour tout ce qui est Web.
- MQTTÂ : Pour les capteurs.
- D-BUS : Pour la communication avec un démon quelconque dans un Linux Desktop.
-
Simple et efficace :
- varlink: Je pense que c’est l’idĂ©al si vous avez besoin d’une API de communication qui “sort” d’un logiciel dans un conteneur.
- rpyc: TrÚs facile à prendre en main, parfait pour prototyper un logiciel distribué rapidement.
- ZMQ : Super simple d’accĂšs lĂ aussi.
- Redis/Valkey : BDD trÚs versatile, intéressant pour partager des données à faible durée de vie.
đ VoilĂ , VoilĂ , plus qu’Ă trouver des cas d’usage concrĂȘt pour jouer avec plus de ces technos đ !