Фильтрация и масштабирование подписок
Выйдите за рамки базовых подписок: доставляйте каждому клиенту только интересующие его события с помощью фильтрации на сервере и масштабируйте подписки между несколькими экземплярами Spring Boot.
«Фильтрация и масштабирование подписок» — бесплатный урок GraphQL APIs with Spring Boot на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения GraphQL APIs with Spring Boot, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс GraphQL APIs with Spring Boot содержит 4 уроков всего.
Части этого урока еще не переведены и отображаются на английском.
Not Every Client Wants Everything
A naive subscription pushes every event to every subscriber. But a user watching order #42 does not care about order #99.
Filtering ensures each subscriber only receives the events relevant to them.
Subscription Arguments
Subscriptions can take arguments just like queries. A client passes the ID it cares about, and the server uses it to filter the stream.
type Subscription {
orderUpdated(orderId: ID!): Order
}Reactive Streams Recap
Spring for GraphQL represents a subscription as a Reactor Flux, an asynchronous stream of items. Filtering is just stream operations applied to that Flux.
Filtering with filter()
Apply .filter() to the publisher so only matching events flow to the subscriber.
@SubscriptionMapping
public Flux<Order> orderUpdated(@Argument String orderId) {
return orderPublisher.flux()
.filter(o -> o.getId().equals(orderId));
}A Shared Event Sink
Use a Reactor Sinks.Many as a hub. Your service emits events into it, and every subscription builds a filtered view of its stream.
private final Sinks.Many<Order> sink =
Sinks.many().multicast().onBackpressureBuffer();Emitting Events
When your business logic changes an order, push it into the sink so all matching subscribers are notified.
public void updateOrder(Order order) {
repository.save(order);
sink.tryEmitNext(order);
}The Scaling Problem
An in-memory sink only knows about events on its own JVM. With multiple Spring Boot instances behind a load balancer, an event emitted on instance A never reaches subscribers connected to instance B.
External Pub/Sub to the Rescue
Route events through an external broker like Redis Pub/Sub or Kafka. Every instance publishes to and subscribes from the broker, so all instances see all events.
Bridging Redis to a Flux
Subscribe to a Redis channel and feed incoming messages into the same Flux your GraphQL subscription exposes, unifying local and remote events.
redisTemplate.listenToChannel("orders")
.map(msg -> deserialize(msg.getMessage()))
.subscribe(sink::tryEmitNext);Backpressure and Cleanup
Slow clients can fall behind. Use a bounded buffer or drop strategy, and ensure resources are released when a client disconnects so memory does not leak.
Sinks.many().multicast().onBackpressureBuffer(1024, false);Best Practices
Keep subscriptions efficient:
- Filter on the server, never push everything
- Use an external broker to scale across instances
- Handle backpressure for slow consumers
- Clean up on disconnect to avoid leaks
Quick Check
Test your subscription scaling knowledge.
Recap
You scaled real-time subscriptions:
- Filter streams with
.filter()using subscription arguments - Use a
Sinks.Manyhub to broadcast events - Route through Redis or Kafka to scale across instances
- Manage backpressure and clean up on disconnect
Filtered, distributed subscriptions deliver the right data at scale.
Часто задаваемые вопросы
Урок «Фильтрация и масштабирование подписок» бесплатный?
Да — полный текст урока «Фильтрация и масштабирование подписок» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс GraphQL APIs with Spring Boot, подпишись на CoddyKit PRO. Курс GraphQL APIs with Spring Boot содержит 4 уроков всего.
Чему я научусь в уроке «Фильтрация и масштабирование подписок»?
Выйдите за рамки базовых подписок: доставляйте каждому клиенту только интересующие его события с помощью фильтрации на сервере и масштабируйте подписки между несколькими экземплярами Spring Boot. Ты практикуешь GraphQL APIs with Spring Boot с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать GraphQL APIs with Spring Boot?
Предыдущий опыт не требуется. GraphQL APIs with Spring Boot на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Фильтрация и масштабирование подписок»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке GraphQL APIs with Spring Boot?
Да. Каждый урок GraphQL APIs with Spring Boot включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Понимание подписок GraphQL
- Реализация обновлений в реальном времени
- Интеграция WebSockets со Spring
- Фильтрация и масштабирование подписок