GraphQL-API'er med Spring Boot · Lektion

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.

Lektion 4 af 413 trin

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.

Gratis at komme i gang

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

  1. Forståelse af GraphQL-subscriptions
  2. Implementering af opdateringer i realtid
  3. Integration af WebSockets med Spring
  4. Filtrering og skalering af subscriptions
← Tilbage til GraphQL-API'er med Spring Boot