đ 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
stockage
des BDD - Lâaspect
asynchrone
des 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 đ !