Filtrering og skalering af subscriptions
Gå videre end grundlæggende subscriptions: Lever kun de hændelser, hver klient er interesseret i, med filtrering på serversiden, og skaler subscriptions på tværs af flere Spring Boot-instanser.
Filtrering og skalering af subscriptions er en gratis GraphQL-API'er med Spring Boot-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 GraphQL-API'er med Spring Boot, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. GraphQL-API'er med Spring Boot-kurset indeholder 4 lektioner i alt.
Ikke alle klienter vil have alt
En naiv abonnementsløsning sender hver hændelse til alle abonnenter. Men en bruger, der ser ordre nr. 42, er ligeglad med ordre nr. 99.
Filtrering sikrer, at hver abonnent kun modtager de hændelser, der er relevante for vedkommende.
Argumenter til abonnementer
Abonnementer kan tage argumenter ligesom forespørgsler. En klient sender det ID, den er interesseret i, og serveren bruger det til at filtrere strømmen.
type Subscription {
orderUpdated(orderId: ID!): Order
}Opsummering af reaktive strømme
Spring for GraphQL repræsenterer et abonnement som en Reactor-Flux, altså en asynkron strøm af elementer. Filtrering er blot strømoperationer, der anvendes på denne Flux.
Filtrering med filter()
Anvend .filter() på udgiveren, så kun matchende hændelser flyder videre til abonnenten.
@SubscriptionMapping
public Flux<Order> orderUpdated(@Argument String orderId) {
return orderPublisher.flux()
.filter(o -> o.getId().equals(orderId));
}En delt hændelseskilde
Brug en Reactor-Sinks.Many som samlingspunkt. Din service sender hændelser ind i den, og hvert abonnement opbygger en filtreret visning af sin strøm.
private final Sinks.Many<Order> sink =
Sinks.many().multicast().onBackpressureBuffer();Udsendelse af hændelser
Når din forretningslogik ændrer en ordre, skal du sende den ind i hændelseskilden, så alle matchende abonnenter får besked.
public void updateOrder(Order order) {
repository.save(order);
sink.tryEmitNext(order);
}Skaleringsproblemet
En hændelseskilde i hukommelsen kender kun hændelser på sin egen JVM. Med flere Spring Boot-instanser bag en belastningsfordeler når en hændelse, der udsendes på instans A, aldrig frem til abonnenter, der er forbundet til instans B.
Ekstern pub/sub til undsætning
Send hændelser gennem en ekstern broker som Redis Pub/Sub eller Kafka. Hver instans udgiver til og abonnerer på brokeren, så alle instanser ser alle hændelser.
Forbindelse fra Redis til en Flux
Abonnér på en Redis-kanal, og før indgående meddelelser ind i den samme Flux, som dit GraphQL-abonnement eksponerer, så lokale og eksterne hændelser samles.
redisTemplate.listenToChannel("orders")
.map(msg -> deserialize(msg.getMessage()))
.subscribe(sink::tryEmitNext);Overbelastningshåndtering og oprydning
Langsomme klienter kan sakke bagud. Brug en buffer med begrænset størrelse eller en strategi til at kassere elementer, og sørg for at frigive ressourcer, når en klient afbryder forbindelsen, så hukommelsen ikke lækker.
Sinks.many().multicast().onBackpressureBuffer(1024, false);Bedste praksis
Hold abonnementer effektive:
- Filtrér på serveren, og send aldrig alt
- Brug en ekstern broker til skalering på tværs af instanser
- Håndtér overbelastning for langsomme modtagere
- Ryd op ved afbrydelse for at undgå lækager
Hurtigt tjek
Test din viden om skalering af abonnementer.
Opsummering
Du har skaleret abonnementer i realtid:
- Filtrér strømme med
.filter()ved hjælp af abonnementsargumenter - Brug en
Sinks.Many-samlingspunkt til at udsende hændelser - Send gennem Redis eller Kafka for at skalere på tværs af instanser
- Håndtér overbelastning, og ryd op ved afbrydelse
Filtrerede, distribuerede abonnementer leverer de rigtige data i stor skala.
Lær GraphQL-API'er med Spring Boot 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 “Filtrering og skalering af subscriptions” gratis?
Ja — hele teksten til “Filtrering og skalering af subscriptions” 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 GraphQL-API'er med Spring Boot-kurset, skal du opgradere til CoddyKit PRO. GraphQL-API'er med Spring Boot-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Filtrering og skalering af subscriptions”?
Gå videre end grundlæggende subscriptions: Lever kun de hændelser, hver klient er interesseret i, med filtrering på serversiden, og skaler subscriptions på tværs af flere Spring Boot-instanser. Du øver dig i GraphQL-API'er med Spring Boot 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å GraphQL-API'er med Spring Boot?
Der kræves ingen tidligere erfaring. GraphQL-API'er med Spring Boot 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 “Filtrering og skalering af subscriptions”?
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 GraphQL-API'er med Spring Boot-lektion?
Ja. Alle GraphQL-API'er med Spring Boot-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
- Forståelse af GraphQL-subscriptions
- Implementering af opdateringer i realtid
- Integration af WebSockets med Spring
- Filtrering og skalering af subscriptions