WebSockets og realtidssystemer med Spring · Lektion

Heartbeats og ping/pong-holdalive

Registrér døde WebSocket-forbindelser tidligt ved hjælp af ping/pong-frames og STOMP-heartbeats, så serveren frigiver ressourcer, og klienter hurtigt opretter forbindelse igen.

Lektion 4 af 413 trin

Heartbeats og ping/pong-holdalive er en gratis WebSockets og realtidssystemer med Spring-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i WebSockets og realtidssystemer med Spring, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. WebSockets og realtidssystemer med Spring-kurset indeholder 4 lektioner i alt.

Problemet med den stille død

En WebSocket kan se åben ud længe efter, at modparten er forsvundet. Et laptoplåg lukkes, et netværk falder ud, en NAT-tilknytning udløber – men ingen af siderne modtager en lukkeramme. Det er en halvåben forbindelse.

Hvorfor det er vigtigt

Halvåbne sockets spilder serverhukommelse, holder sessioner permanent i maps og får klienten til at tro, at den stadig modtager opdateringer. Du har brug for en aktiv sonde for at finde sandheden: et heartbeat.

Ping/pong-kontrolframes

WebSocket-protokollen definerer kontrolframes med ping og pong. Den ene side sender en ping, og en sund modpart skal svare med en pong. Hvis der ikke kommer en pong inden for en tidsfrist, er forbindelsen død.

STOMP-heartbeats i Spring

Når du bruger STOMP over WebSocket, stiller Spring konfiguration af heartbeats til rådighed. De to tal angiver den hastighed (ms), som serveren sender heartbeats med, og den hastighed, som den forventer at modtage dem med.

registry.enableSimpleBroker("/topic")
  .setHeartbeatValue(new long[]{10000, 10000})
  .setTaskScheduler(heartbeatScheduler());

En scheduler er nødvendig

Heartbeats kræver en TaskScheduler for at blive udløst til tiden. Uden en sådan deaktiverer Spring dem lydløst.

@Bean
public ThreadPoolTaskScheduler heartbeatScheduler() {
  ThreadPoolTaskScheduler s = new ThreadPoolTaskScheduler();
  s.setPoolSize(1);
  s.initialize();
  return s;
}

STOMP-heartbeats på klientsiden

Klienten angiver det tilsvarende heartbeat-interval. Forhandlingen vælger den langsommere værdi fra hver side.

const client = new StompJs.Client({
  brokerURL: 'wss://api.example.com/ws',
  heartbeatIncoming: 10000,
  heartbeatOutgoing: 10000
});

Rå ping på containerniveau

For almindelige (ikke-STOMP-)handlere kan du sende ping-frames direkte fra serversessionen.

PingMessage ping = new PingMessage(ByteBuffer.wrap(new byte[]{1}));
session.sendMessage(ping);

Valg af interval

Tilpas intervallet til dine behov:

  • Et for kort interval spilder båndbredde og batteri på mobile enheder
  • Et for langt interval forsinker registreringen af døde modparter
  • 10–30 sekunder er ofte et godt kompromis

Overholdelse af inaktive tidsgrænser

Proxyer og loadbalancere afbryder forbindelser, der har været inaktive for længe (ofte 60 sek.). Et heartbeat fungerer også som keep-alive-trafik, der nulstiller de inaktive tidsmålere og forhindrer dem i at afbryde en sund socket.

Reaktion på et manglende heartbeat

Når et heartbeat mangler, lukker Spring sessionen og udløser afterConnectionClosed. Brug dette hook til at rydde op i tilstanden og lade klienten udløse sin logik til genforbindelse.

@Override
public void afterConnectionClosed(WebSocketSession s, CloseStatus status) {
  registry.remove(s.getId());
  log.warn("Closed {} - {}", s.getId(), status);
}

Heartbeats kontra applikationskvitteringer

Et heartbeat beviser, at transporten er i live; det beviser ikke, at din meddelelse er blevet behandlet. Til garantier på forretningsniveau har du stadig brug for applikationskvitteringer oven på heartbeats.

Hurtigt tjek

Test din forståelse af keep-alives.

Opsummering

Du har gjort forbindelser selvhelende:

  • Halvåbne sockets dør lydløst; heartbeats afslører dem
  • Ping/pong-kontrolframes undersøger transportens tilstand
  • STOMP-heartbeats kræver en TaskScheduler og matchende klientintervaller
  • Heartbeats omgår også proxyers tidsgrænser for inaktivitet
  • Brug callback-funktionen for lukning til at rydde op og udløse genforbindelser
Gratis at komme i gang

Lær WebSockets og realtidssystemer med Spring med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
12
Lektioner
48

Ofte stillede spørgsmål

Er lektionen “Heartbeats og ping/pong-holdalive” gratis?

Ja — hele teksten til “Heartbeats og ping/pong-holdalive” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af WebSockets og realtidssystemer med Spring-kurset, skal du opgradere til CoddyKit PRO. WebSockets og realtidssystemer med Spring-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Heartbeats og ping/pong-holdalive”?

Registrér døde WebSocket-forbindelser tidligt ved hjælp af ping/pong-frames og STOMP-heartbeats, så serveren frigiver ressourcer, og klienter hurtigt opretter forbindelse igen. Du øver dig i WebSockets og realtidssystemer med Spring med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på WebSockets og realtidssystemer med Spring?

Der kræves ingen tidligere erfaring. WebSockets og realtidssystemer med Spring på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “Heartbeats og ping/pong-holdalive”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne WebSockets og realtidssystemer med Spring-lektion?

Ja. Alle WebSockets og realtidssystemer med Spring-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Robust håndtering af WebSocket-fejl
  2. Håndtering af forbindelsens livscyklus
  3. Genforsøg og fallback-mekanismer
  4. Heartbeats og ping/pong-holdalive
← Tilbage til WebSockets og realtidssystemer med Spring