Vinicius Aguiar

Ingénierie

Des systèmes que j'ai conçus et exploités en production — décisions d'architecture, trade-offs et contraintes réelles.

Problèmes résolus en production

Performance frontend

Inbox d'un SaaS B2B chargeant ~20 000 conversations d'un coup (~6,7 MB par requête) — pagination cursor-based + virtualisation de liste, payload de ~19 KB et fin des blocages de l'interface

Latence d'API

Timeouts d'API de marketplaces provoquant des défaillances en cascade dans le checkout d'une opération de dropshipping — circuit breaker avec fallbacks et monitoring (implémentation complète sur le blog)

Incohérences de marketplace

Les API de Mercado Livre et de Shopee renvoyant des données produit incohérentes — adapter pattern normalisant les schemas dans un modèle unifié

Migration du legacy

Plateforme d'esthétique avec 50k+ utilisateurs migrant d'un monolithe PHP 5.3 vers React + Next.js sans downtime — migration incrémentale, écran par écran (strangler fig)

Performance à grande échelle

Temps de réponse qui se dégradaient avec la croissance de la base d'utilisateurs sur une plateforme de santé web + mobile — optimisation de queries, caching stratégique et appels parallèles

UX cross-platform

Garder une UX cohérente entre React (web) et React Native (mobile) dans le même produit — design tokens et contrats de composants partagés

Cohérence des données

Modules financiers d'un SaaS pour pet shops (ventes + commissions + paiements) qui se désynchronisaient — transactions atomiques avec les advisory locks de PostgreSQL

Systèmes d'IA en production

Pas de chatbots — des pipelines en production où l'IA est un composant d'un système plus large, avec fallbacks, monitoring et de vraies données qui circulent.

Agent IA sur WhatsApp

Agent avec LLM pour le service client, la recommandation de produits et la finalisation des ventes. Messages traités de façon asynchrone, données enregistrées dans PostgreSQL. Fallback vers un matching par règles quand le LLM est indisponible.

Pipeline RAG (LangChain + pgVector)

Ingestion de documents → chunking → génération d'embeddings → stockage vectoriel dans PostgreSQL avec pgVector → recherche sémantique avec top-K comme contexte pour le LLM.

Lire l'implémentation complète →

Questions fréquentes

Qu'est-ce que la pagination cursor-based et quand l'utiliser ?

Au lieu d'OFFSET/LIMIT, chaque page est récupérée à partir d'un cursor — un pointeur stable vers le dernier enregistrement chargé (ex. : created_at + id). Cela maintient le coût de lecture constant sur les grandes listes et évite les éléments dupliqués ou sautés quand de nouveaux enregistrements arrivent pendant la navigation. C'est le bon choix pour les feeds et les inboxes ; le trade-off est de perdre le saut direct vers une page arbitraire.

Qu'est-ce que l'architecture multi-tenant ?

Un design pattern où plusieurs organisations partagent la même application et la même base de données, mais où les données de chaque tenant sont isolées. L'approche la plus courante dans le SaaS moderne est une base partagée avec une colonne tenant_id et le Row Level Security (RLS) de PostgreSQL comme filet de sécurité.

Comment traiter les webhooks de paiement de façon fiable ?

Utilisez une approche en couches : validez les signatures sur chaque événement, garantissez l'idempotence avec des IDs d'événements stockés, répondez immédiatement et traitez en background, validez les transitions d'état avec une state machine, exécutez des jobs de réconciliation périodiques et dirigez les événements en échec vers une dead letter queue.

Comment intégrer l'IA dans des systèmes de production ?

Considérez l'IA comme un composant du système, pas comme une feature isolée. Traitez les messages de façon asynchrone, réécrivez les données dans la base, implémentez des fallbacks au cas où le LLM serait indisponible et surveillez la qualité des réponses. Le point central est la fiabilité — le système doit fonctionner même quand le fournisseur d'IA a des problèmes.

Qu'est-ce que le pattern circuit breaker ?

Un pattern de résilience pour les intégrations avec des API tierces. Quand une API externe commence à échouer, le circuit breaker « s'ouvre » et renvoie des réponses fallback au lieu de propager la panne à travers le système. Après une période de cooldown, il autorise des requêtes de test pour vérifier si le service est rétabli.