- Benchmark des performances publish/subscribe (pub-sub) et queue de Postgres, montrant qu’une base de données unique peut potentiellement remplacer un système de messagerie
- Sur un nœud unique de 4 vCPU, 5 036 écritures/s et 25 183 lectures/s, avec un débit similaire maintenu dans un environnement répliqué à 3 nœuds, pour une latence de bout en bout de 186 ms (p99)
- Sur un grand nœud de 96 vCPU, performances atteignant 238 MiB/s en écriture et 1,16 GiB/s en lecture, avec une marge confortable puisque l’utilisation CPU reste sous les 10 %
- Les tests de queue montrent aussi 2 885 opérations/s sur un nœud unique et 2 397 en environnement répliqué, des performances suffisantes pour la plupart des entreprises
- La démonstration montre qu’au lieu d’un système distribué complexe, une infrastructure Postgres unique peut suffire pour traiter des charges de travail de plusieurs MB/s, en défendant une approche pragmatique : « utilisez la technologie la plus simple jusqu’à ce qu’elle ne suffise plus »
Deux camps dans le choix technologique
- L’industrie tech se divise entre un camp piloté par les buzzwords et un camp guidé par le bon sens
- Le premier est attiré par des termes marketing comme « temps réel », « scalabilité infinie » ou « propulsé par l’IA »
- Le second privilégie la simplicité et le pragmatisme, en évitant la complexité inutile
- Deux tendances récentes renforcent ce second camp : Small Data et la renaissance de Postgres
- Les volumes de données diminuent tandis que le matériel devient plus puissant
- Postgres peut remplacer, à lui seul, diverses solutions spécialisées (
jsonb, pgvector, tsvector, etc.)
Aperçu du benchmark
- Objectif : mesurer jusqu’où Postgres peut monter en charge pour la messagerie pub/sub et le traitement de queues
- Environnement de test : AWS EC2
c7i.xlarge (4 vCPU) et c7i.24xlarge (96 vCPU)
- Comparaison de trois configurations
- nœud unique
- cluster répliqué à 3 nœuds
- grand nœud unique
Résultats du benchmark Pub/Sub
- Nœud unique 4 vCPU
- écriture 4,8 MiB/s (5 036 msg/s), lecture 24,6 MiB/s (25 183 msg/s), latence 60 ms (p99)
- CPU à 60 %, disque à 46 MiB/s en écriture
- Réplication 3 nœuds, 4 vCPU
- écriture 4,9 MiB/s, lecture 24,5 MiB/s, latence 186 ms (p99)
- débit maintenu, pour un coût annuel d’environ 11 514 $
- Nœud unique 96 vCPU
- écriture 238 MiB/s (243k msg/s), lecture 1,16 GiB/s (1,2M msg/s), latence 853 ms (p99)
- CPU sous les 10 %, le goulot d’étranglement venant de la vitesse d’écriture par partition
- Conclusion : des performances suffisamment élevées pour rivaliser avec Kafka sur des charges faibles à moyennes, avec une architecture simple capable de traiter plusieurs dizaines de MiB/s
Résultats du benchmark Queue
- Implémentation d’une queue simple basée sur
SELECT FOR UPDATE SKIP LOCKED
- Nœud unique 4 vCPU
- 2,81 MiB/s (2 885 msg/s), latence 17,7 ms (p99), CPU à 60 %
- Réplication 3 nœuds, 4 vCPU
- 2,34 MiB/s (2 397 msg/s), latence 920 ms (p99), CPU à 60 %
- Nœud unique 96 vCPU
- 19,7 MiB/s (20 144 msg/s), latence 930 ms (p99), CPU à 40–60 %
- Même avec un seul nœud, les besoins de débit en queue de la plupart des entreprises peuvent être couverts
Quand choisir Postgres
- Dans la plupart des cas, choisir Postgres par défaut est rationnel
- les messages peuvent être débogués, modifiés et joints en SQL
- exploitation plus simple et maintenance plus facile que Kafka
- Kafka est optimisé pour la très haute performance, mais représente souvent un choix excessif pour de petites charges
- Rappel de l’avertissement de Donald Knuth : « l’optimisation prématurée est la racine de tous les maux »
- jusqu’à plusieurs MB/s, Postgres suffit largement
L’approche MVI (Minimum Viable Infrastructure)
- Minimum Viable Infrastructure : construire le système minimal avec des technologies déjà maîtrisées par l’organisation
- Postgres est largement adopté et le recrutement de profils compétents y est facile
- moins il y a de composants, plus la charge opérationnelle et le risque de panne diminuent
- L’introduction de technologies inutiles entraîne un surcoût organisationnel
- hausse des coûts de formation, de monitoring, de déploiement et d’exploitation
Discussion sur la scalabilité
- Postgres est réellement capable de monter en charge
- OpenAI utilise toujours Postgres avec une instance d’écriture unique
- le système fonctionne de manière stable même à l’échelle de centaines de millions d’utilisateurs
- La plupart des entreprises croissent progressivement et disposent donc de plusieurs années avant de devoir remplacer leur pile technique
- Concevoir dès le départ « pour devenir viral » relève d’un surdesign
- comparaison donnée : « c’est comme acheter un ampli Marshall pour faire la première partie de Coldplay »
Conclusion
- « Utilisez Postgres jusqu’à ce qu’il casse »
- une technologie simple peut déjà offrir des performances très élevées
- adopter trop tôt un système distribué complexe est inefficace
- avec le matériel moderne, Postgres constitue un choix pragmatique capable d’absorber la plupart des charges de travail
1 commentaires
Discussion sur Hacker News
Appliquer le principe de Pareto à toutes les situations est une mauvaise interprétation
Dire que Postgres couvre 80 % des cas d’usage de Kafka avec 20 % de l’effort est une affirmation sans fondement
Le principe de Pareto n’a de sens que dans les situations où l’on observe une distribution en loi de puissance
Il suffit simplement de dire que Postgres couvre suffisamment de cas d’usage, qu’il est stable et qu’il s’agit d’un outil éprouvé
D’après mon expérience, de petites charges (quelques centaines d’événements par heure) jusqu’aux grandes échelles (des milliers de milliards d’événements par heure), il faut d’abord se demander si une file est vraiment nécessaire
UPDATEsont particulièrement péniblesL’approche qui consiste à utiliser Postgres pour tout est risquée
Les verrous et niveaux de sérialisation ne sont pas intuitifs et peuvent créer des goulots de performance
J’utilise Postgres depuis des décennies, mais il ne faut pas concevoir une architecture sur la base d’une foi aveugle
LISTEN/NOTIFYne scale pas (lien connexe)Je pense que l’approche par table de log d’événements basée sur SQL est efficace
Son inconvénient reste le manque d’outils côté client. Kafka a l’avantage d’un riche écosystème de bibliothèques
Dans notre entreprise, nous avons standardisé la transmission d’événements entre services sur une base SQL (feedapi-spec)
Ce n’est pas aussi mature que Kafka, mais cela pourrait évoluer en une pile de bibliothèques commune prenant en charge plusieurs moteurs de stockage
De nos jours, les gens ont trop tendance à se laisser séduire par les nouvelles technologies
Postgres est excellent, mais il faut utiliser l’outil adapté au problème
Postgres n’a pas été conçu pour le pub-sub, Kafka si
Il faut éviter cette tendance où tous les produits veulent « tout faire ». Je pense qu’il vaut mieux avoir des outils spécialisés qui font bien une chose
Implémenter des numéros d’offset monotones croissants est un problème délicat
Une simple séquence pose problème car l’ordre transactionnel et le moment du commit peuvent diverger
SELECT FOR UPDATE SKIP LOCKEDJe me demande s’ils ont réellement benchmarké Kafka
Les résultats obtenus dans un environnement à 96 vCPU sont aussi atteignables avec une configuration Kafka à 4 vCPU
Les performances de Postgres sont anormalement lentes
Si vous n’avez pas besoin de Kafka, ne l’utilisez pas, mais se vanter de faire 5k msg/s avec Postgres n’a aucun sens
Il y a deux extrêmes : les « obsédés des nouvelles technos » et ceux qui « s’accrochent uniquement à ce qu’ils ont appris »
Un ingénieur réaliste fait des choix pragmatiques entre les deux
La fonction clé de Kafka, c’est le contrôle des offsets par consommateur
C’est indispensable dans les environnements où plusieurs équipes lisent le même topic
Le fait de pouvoir avancer ou reculer les offsets m’a servi de bouée de sauvetage à plusieurs reprises
Je me demande si une file Postgres peut offrir ce genre de fonctionnalité
L’opposition entre le « camp qui court après les buzzwords » et le « camp du bon sens » est elle-même erronée
Réimplémenter Kafka avec Postgres, ce n’est pas du bon sens
Si vous avez vraiment besoin de fonctionnalités au niveau de Kafka, utilisez simplement Kafka