Primus

Compétence
Intérêt

Moins connu que Socket.IO, Primus est une lib de manipulation de sockets de qualité.

Primus trouve sa place dans les projets temps réel tels que moteur de jeux multi-joueurs, des chats multi-rooms, mise à jour de contenu en temps réel, fallback pour le WebRTC, communication de serveur à serveur en temps réel pour la gestion de la haute disponibilité et du monitoring d'un cluster.

Primus est performant dans tout types d'applications temps réel. Avec Redis pour la persistance temporaire et la scalabilité on peut créer des structures robustes.

Pourquoi Primus ?

Mes 3 raisons principales :

  • fiable et robuste
  • activement maintenu
  • API propre, simple et flexible

Socket.IO est la lib socket la plus populaire dans Node.js. Elle est utilisée par de nombreux services qui dépendent de fonctionnalités en temps réel comme des notifications push, des jeux et mise à jour de contenu en temps réel.

Dans la v0.9 de Socket.io, il existait de sérieux bugs et fuites de mémoire. Ces bugs sont restés présent pendant plusieurs mois. Pour des petits / moyens projets, les conséquences n'étaient pas visibles immédiatement. Cependant lorsqu'on arrivait à des pics de plusieurs centaines de connectés simultanés (600 / 800), les erreurs commençaient à apparaître et la fuite de mémoire devenait le goulot d'étranglement qui faisaient ralentir, voir planter le service.

Note: Depuis la v1 de Socket.io qui est une abstraction au dessus d'Engine.io, nombre de ces bugs ont été corrigés.

Partie de ce constat Primus a été créé en tant qu'alternative par un des contributeurs de socket.IO, Arnout Kazemier un développeur (chez Nodejitsu) spécialisé dans le temps réel (très sympa au passage).

D'autres développeurs ont par la suite rejoint le projet.

Contrairement à Socket.io, lorsqu'un bug est déclaré il est tout de suite corrigé.

Primus fournit une couche d'abstraction au dessus des libs socket les plus populaires. Il s'agit donc d'un module qui enveloppe des libs comme SockJS, Engine.IO, BrowserChannel, ... (Tout comme Socket.io enveloppe Engine.IO).

Si la lib socket utilisée n'est plus maintenu ou qu'un bug non corrigé apparaît avec une nouvelle release, il suffit simplement de changer le transformer utilisé, par un autre (une autre lib socket).

L'API est propre, un système de plugins simple et flexible permet d'étendre Primus.

Le plus important dans une telle techno qui est souvent au centre des services temps réel, est que Primus est activement maintenu par des personnes ayant tout intérêt de part leurs activités à avoir une lib fiable et robuste.

Cependant pour des besoins de performance et scalabilité pouvant gérer de très fortes charges, j'ai été amené à développer les serveurs de sockets proche du natif, sans le superflu implémenté dans Primus ou encore Socket.io. Le résultat est un gain considérable de performance et une maîtrise parfaite de l'environnement du cluster de serveurs sockets.
De plus, Primus et Socket.io avaient davantage d'utilités à une époque où les navigateurs ne supportaient pas correctement les WebSockets et qu'il fallait user de fallback (Flash, long polling, ...).