Fare MediaService corretto su più di un baccello, e eseguire due

FeatureMediaService
Spegnimento
4 settembre 2026 alle ore 20:20 UTC
Autore
Kamo
Impegno
6ef1e59

MediaService ha mai eseguito solo una singola replica, quindi una distribuzione di esso era un outage di chat totale e un OOM era lo stesso. Non poteva eseguire due, per motivi che erano tutti nel codice: 1. Il BROKER STOMP è in-HEAP. abilitareSimpleBroker significa convertireAndSend raggiunge solo i WebSockets collegato al baccello che fa la chiamata. Tredici relè controller già gestito correttamente questo sottoscrivendo a NATS con un semplice dispacciatore (nessun gruppo di coda, così ogni capsula riceve ogni messaggio) e ri-publishing localmente. Tredici altri siti di chiamata non hanno — digitando indicatori, presenza, badge non letti, borse di risposta, WebRTC offerta/risposta/ICE, notifiche in arrivo-chat — e ciascuno avrebbe consegnato a circa la metà del suo pubblico destinato. StompFanout generalizza il modello che quei relè già utilizzano: pubblicare {destinazione, payload} su un soggetto NATS core, ogni pod lo relays nel proprio broker. Core NATS, non JetStream, perché questi sono eventi live-moment con nessun valore riprodotto e nessun flusso che copre il soggetto. Poiché NATS core consegna anche all'editore, send() non scrive anche localmente — che avrebbe consegnato due volte qui. Con NATS giù rientra in un invio locale, che è quello che il la piattaforma ha fatto prima. 2. Il CONSUMO DI PER-CONVERSAZIONE era un DURABILE ESCLUSIVA. ChatSessionSubscriptionManager ha nominato il suo JetStream resistente dopo la chat GUID sessione, e un consumatore di spinta durevole ammette esattamente uno abbonato. Il legame del secondo pod è stato rifiutato [SUB-90012] e ogni membro la cui presa è atterrata non ha ricevuto nulla — nessun messaggio, nessuna ricevuta di lettura, nessun evento aggiunto membro, nessun errore. Ora un consumatore effimero: nessun nome da collidere sopra, uno per pod, recuperato dal server. Il retry questo rimuove inventato un nome fresco durevole sulla collisione. Ha funzionato, e ha perso un consumatore permanente lato server per collisione che nulla ha mai cancellato. 3. FIVE MORE FISSO-NAME DURABLES, bisogno di trattamento opposto a seconda del lavoro. La conversione e i relè STOMP VOIP sono passati attraverso JetStream piuttosto che un invio di nucleo, quindi avevano lo stesso bug di esclusività — ora effimero, dal momento che ogni capsula deve ricevere. Il notificante chat-email, sociale il consumatore in entrata e la conversione di marketing deve eseguire esattamente ONCE, in modo da mantenere il loro durevole e unire un gruppo di consegna, il che significa anche un sopravvissuto prende il lavoro quando un baccello muore. Sono necessarie sessioni appiccicose sul percorso dei media, non facoltative: questi client STOMP utilizzano SockJS, il cui xhr-streaming/xhr-polling fallback è diverse richieste HTTP in piedi per una connessione contro lo stato di sessione che vive nella memoria di un baccello. La rotonda la rompe. Vedere ingressroute.yaml. replica 1 -> 2. 367 test passa.

Tutte le modifiche

Come quello che vedi la spedizione?

Ognuno di questi aggiornamenti atterra automaticamente nello spazio di lavoro. Inizia gratis e guardalo crescere settimana dopo settimana.

Inizia gratis per sempreVisualizza il prezzo