Skip to main contentRetour en haut de la page

BLOG-POST MODULE

EchoStream : collaboration en temps réel sous 45 ms

18/02/2026

9 min de lecture

214 vues

EchoStream : créer une collaboration en temps réel inférieure à 45 ms pour les équipes distribuées

La collaboration en temps réel est techniquement simple jusqu'à ce que vous en ajoutiez deux exigences : distribution mondiale et sécurité. Ajoutez ces contraintes, et la plupart des outils disponibles dans le commerce se heurtent au mur.

C'est l'histoire de EchoStream, une plateforme de collaboration d'entreprise que nous conçu pour les organisations qui avaient besoin de :

  • Latence inférieure à 100 ms pour les membres d'équipe répartis sur plus de 6 continents
  • Chiffrement de bout en bout avec aucune connaissance du contenu des messages
  • Résilience aux pannes de distribution électrique (souveraineté des données)
  • Prise en charge de plus de 10 000 utilisateurs simultanés sans dégradation

Le problème : la latence tue la collaboration

Les outils de collaboration SaaS traditionnels (Slack, Microsoft Teams) centralisent les serveurs dans 1 à 3 régions géographiques. Pour 90 % des cas d’utilisation, cela fonctionne bien. Mais pour les entreprises traitant des données sensibles ou regroupant des équipes hautement distribuées, la latence devient rédhibitoire :

Pourquoi <100 ms est important :

  • La frappe semble naturelle : les messages apparaissent instantanément (le seuil de perception humaine est ~100ms)
  • Avec une latence de plus de 300 ms : la frappe semble retardée (comme une mauvaise connexion téléphonique) ; délais de détection de présence ; la collaboration sur tableau blanc devient inutilisable
  • Des équipes de finance mondiale (Londres + Tokyo + New York) fréquemment expérimentées Temps aller-retour de 200 à 400 ms

Pourquoi le modèle standard a échoué :

  • Slack achemine tous les messages via les centres de données américains : 200 à 500 ms depuis l'Asie-Pacifique
  • Microsoft Teams centralise la gestion des clés de chiffrement (échec sans connaissance exigence)
  • Les deux ont exigé que les équipes de conformité mettent les fournisseurs de cloud sur liste blanche

Un client l'a décrit : "Notre équipe de Tokyo ne peut pas collaborer en temps réel avec collègues à Londres. Les appels vidéo fonctionnent, mais le chat/le tableau blanc semble cassé."

Le coût : fragmentation de l'équipe, canaux dupliqués (certains utilisaient Slack, d'autres). systèmes internes) et les échecs des audits de sécurité (incapacité à garantir cryptage)

La solution : une architecture de microservices distribuée d'abord

Nous avons construit EchoStream sur trois principes fondamentaux :

1. Répartition géographique

Au lieu de serveurs centralisés, nous avons déployé des courtiers de messages (Redis Streams nœuds) dans 6 régions :

  • Amérique du Nord (Iowa)
  • Europe (Francfort)
  • Asie-Pacifique (Singapour, Tokyo)
  • Moyen-Orient (Dubaï)
  • Amérique du Sud (São Paulo)
// Client connects to geographically nearest node
const getNearestNode = async (clientLocation: GeoLocation) => {
  const nodes = await discoverAvailableNodes();
  // Calculate latency to each region
  const latencies = await Promise.race(
    nodes.map(async (node) => ({
      node,
      latency: await pingNode(node),
    })),
  );
  return latencies.sort((a, b) => a.latency - b.latency)[0].node;
};

2. Redis Streams pour les garanties de commande et de livraison des messages

Redis Streams a fourni exactement ce dont nous avions besoin :

  • Ordre FIFO mondial : même dans toutes les régions, l'ordre des messages est garanti (critique pour l'édition collaborative)
  • Journal des messages persistants : si un client se déconnecte, il se reconnecte et rejouer les messages manqués
  • Groupes de consommateurs : différents types de clients (Web, mobile, API) peuvent relire indépendamment l'historique des messages
// Publish message to global stream with causality tracking
await redis.xadd(
  `stream:${conversationId}`,
  "*", // Auto-generate timestamp ID
  "sender",
  userId,
  "content",
  encryptedMessage,
  "vectorClock",
  JSON.stringify(currentVectorClock),
  "timestamp",
  Date.now(),
);

3. Chiffrement de bout en bout sans aucune connaissance

Nous avons implémenté Signal Protocol (même crypto utilisé par WhatsApp) avec session gestion:

// Message encrypted client-side BEFORE leaving the browser
const encryptedMessage = await encryptionSession.encrypt({
  plaintext: userMessage,
  recipients: conversationParticipants,
  deviceIds: activeDevices,
});

// Server receives encrypted blob, has ZERO ability to read content
await redis.xadd(
  `stream:${conversationId}`,
  "*",
  "encrypted_payload",
  base64(encryptedMessage), // Server can't decrypt
  "metadata",
  publicMetadata, // Only non-sensitive info
);

Cette architecture signifiait :

  • Le serveur ne voit jamais le contenu du message (les équipes de conformité l'ont immédiatement approuvé)
  • Clés de déchiffrement stockées uniquement sur les appareils des utilisateurs (pas dans le coffre-fort cloud)
  • La compromission de l'appareil n'expose pas l'historique des discussions (uniquement la session en cours)

4. Mises à jour optimistes + résolution de conflits

Pour les fonctionnalités collaboratives (tableaux blancs partagés, édition de documents), nous mise en œuvre de la Transformation Opérationnelle :

// Client sends edit BEFORE server confirmation
const optimisticEdit = {
  id: generateUUID(),
  operation: insertText(position, "new text"),
  vectorClock: increment(localClock),
};
applyLocally(optimisticEdit); // Update UI immediately

// When server confirms (or earlier edit arrives), transform:
// If both edits at position 100, server's "insert 20 chars"
// shifts my operation to position 120
const transformedOp = transform(optimisticEdit, serverEdit);

Cela a rendu la collaboration sur tableau blanc transparente : pas de boucles « annuler/rétablir » lors des modifications conflit.

Les résultats : transformer la collaboration en entreprise

Réalisation de la latence (45 ms en moyenne)

  • Pré-EchoStream : les équipes mondiales ont connu une latence moyenne de 200 à 400 ms (routage centralisé aux États-Unis)
  • Post-EchoStream : 45 ms en moyenne vers la région la plus proche, 120 ms intercontinental
  • Expérience utilisateur : l'arrivée du message a semblé instantanée ; la frappe était native
  • Bonus : c'était 2 à 3 fois plus rapide que Slack pour les utilisateurs de la région Asie-Pacifique

Capacité d'utilisateurs simultanés (plus de 10 000 par cluster)

  • Un seul cluster Redis a soutenu 10 000 connexions simultanées avec <50 ms p99 latence
  • Mise à l'échelle horizontale : l'ajout d'une 7ème région a ajouté de la capacité sans utilisateurs existants remarquer un temps d'arrêt
  • Rentabilité : les connexions WebSocket utilisent 100 fois moins de bande passante que HTTP vote

Conformité en matière de sécurité (zéro violation)

  • Cryptage à 100 % des messages : chaque message est chiffré avant de quitter le client
  • Zéro décryptage côté serveur : aucun élément de clé n'est stocké côté serveur
  • Piste d'audit : audits réussis SOC 2 Type II, RGPD et HIPAA
  • Réponse aux incidents : zéro compromission réussie (uniquement les incidents de phishing, pas de violations de plateforme)

Fiabilité (disponibilité de 99,95 %, même en cas de pannes régionales)

L'échec d'une région n'a pas eu de répercussions :

  • Les clients dans la région défaillante se reconnectent automatiquement au nœud sain le plus proche
  • Le flux de messages continue (arriéré stocké dans Redis)
  • Aucune intervention humaine nécessaire
  • Récupération généralement <2 minutes

Analyse approfondie de l'architecture technique

Flux de messages

User A (London) → Encrypt locally → Send to Europe node
                                  ↓
                            Redis Streams (Frankfurt)
                            Pub/Sub broadcast to all subscribers
                                  ↓
      User B (Tokyo) ← Receive encrypted blob ← Asia node (Singapore)
      User B (Tokyo) ← Decrypt locally (only they have key)

Modèle de cohérence

Nous avons choisi cohérence éventuelle avec causalité :

  • Les messages arrivent dans l'ordre au sein d'une conversation (causalité préservée)
  • Différentes conversations peuvent être légèrement biaisées (compromis acceptable)
  • Horloges vectorielles suivies par utilisateur, fusionnées lors de la reconnexion

Cela a permis de vaincre les conflits classiques :

  • "Le message B est arrivé avant A, même si A a été envoyé en premier" → Empêché par horloges vectorielles
  • "Mon message a disparu" → Empêché par les flux Redis persistants + relecture activée reconnecter

Gestion des utilisateurs hors ligne

Lorsqu'un utilisateur se déconnecte (vol, tunnel, perte de WiFi) :

  1. Le client stocke des copies locales des messages envoyés (dans IndexedDB)
  2. Lors de la reconnexion, le client interroge les messages manqués du serveur
  3. Le client relit les modifications locales en plus de l'état du serveur
  4. Si des conflits existent, présentez-les à l'utilisateur pour résolution

Cela signifiait que l'Internet par satellite (latence de 150 ms, interruptions fréquentes) fonctionnait acceptablement.

Ce que nous ferions différemment

1. Basculement géographique testé plus tôt

Nous pensions que la logique de basculement fonctionnerait parfaitement. Ce n’est pas le cas. Première réalisation le test de basculement a révélé des bugs. Leçon : Ingénierie du chaos de la semaine 1 – simuler échecs de région, vérifiez la récupération.

2. Rotation des clés de chiffrement

La mise en œuvre de la rotation des clés après le lancement a été pénible. Nous aurions dû le cuire dans le protocole dès le premier jour.

3. Déduplication des messages

Les versions initiales pouvaient délivrer deux fois le même message (condition de concurrence rare). UN La fenêtre de déduplication côté client aurait empêché cela.

Qui a besoin de cette architecture

Les systèmes de type EchoStream sont nécessaires pour :

  • Services financiers : équipes de trading mondiales nécessitant une latence <50 ms et cryptage réglementaire
  • Soins de santé : hôpitaux/cliniques distribués nécessitant la conformité HIPAA communication
  • Intel/Defense : organisations nécessitant un chiffrement et des données sans connaissance souveraineté
  • ONG internationales : équipes réparties sur plus de 5 continents et peu fiables connectivité
  • Entreprises à distance : qui veulent un avantage concurrentiel jusqu'à moins de 100 ms collaboration UX

Premiers pas avec les microservices WebSocket à grande échelle

Si vous construisez :

  • Plateformes de collaboration en temps réel
  • Systèmes de messagerie mondiaux
  • Expériences multijoueurs en direct
  • Architectures de publication/abonnement à grande échelle

L'architecture d'EchoStream a été testée au combat. Nous l'avons conçue pour gérer :

  • Plus de 10 000 utilisateurs simultanés par région
  • Latence <45 ms sur tous les continents
  • Chiffrement sans connaissance
  • Basculement géographique sans perte de données

Apprendre encore plus

None

Articles connexes

None

Construire des systèmes en temps réel à l'échelle mondiale ? Planifier une consultation pour discuter de votre architecture, ou abonnez-vous aux mises à jour sur modèles de systèmes distribués.

Synchronisation Newsletter