Найти в Дзене
Java

🚀 Spring WebFlux with Server-Sent Events

🚀 Spring WebFlux with Server-Sent Events 🚀

Повышайте интерактивность своих приложений с помощью Spring WebFlux и Server-Sent Events (SSE)! 🔥

• Что такое Server-Sent Events?

SSE — механизм, позволяющий серверу «толкать» данные клиенту по одному направлению (сервер → браузер) через постоянное HTTP-соединение. Идеально подходит для оповещений, обновлений статуса, live-лент и любых реальных данных, где не требуется двунаправленный сокет.

• Почему WebFlux + SSE?

• 🌀 *Реактивная модель*

WebFlux построен на реактивных потоках (`Flux`/`Mono`), что позволяет обрабатывать тысячи параллельных соединений с минимальным использованием ресурсов.

• ⏱️ *Низкая задержка*

Вместо опроса (polling) клиент сразу получает новые события, как только сервер их публикует.

• ⚙️ *Простота интеграции*

Spring WebFlux предоставляет готовые абстракции для SSE, достаточно вернуть Flux<ServerSentEvent<...>> из контроллера.

• Пример простого контроллера SSE в Spring WebFlux

@RestController

public class SseController {

@GetMapping(value = "/sse-stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)

public Flux<ServerSentEvent<String>> streamEvents() {

return Flux.interval(Duration.ofSeconds(1))

.map(seq -> ServerSentEvent.<String>builder()

.id(String.valueOf(seq))

.event("tick")

.data("Тик №" + seq)

.build()

);

}

}

• Здесь Flux.interval() генерирует последовательность чисел каждую секунду.

• Мы формируем ServerSentEvent<String> с идентификатором id, именем события event и полезными данными data.

• Браузер или любой клиент, подписанный на /sse-stream, будет получать сообщение каждую секунду без повторного HTTP-запроса.

Как использовать на клиенте?

<script>

const evtSource = new EventSource("/sse-stream");

evtSource.addEventListener("tick", e => {

console.log("Новое событие:", e.data);

// Можно обновлять UI: например, timestamp или счётчик

});

evtSource.onerror = err => console.error("SSE ошибка:", err);

</script>

• EventSource автоматически подключается к указанному URL и слушает серверные события.

• Метод addEventListener("tick", ...) обрабатывает только события с именем tick.

• Советы и подводные камни

• ⚠️ Обработка отмены (cancel)

Когда клиент закрывает страницу или отключается, WebFlux автоматически отменит подписку на Flux. При необходимости можно добавить .doOnCancel(...) для логирования или очистки ресурсов.

• 🛠️ Ошибка и повторная попытка (retry)

При сетевых сбоях браузер сам попытается переподключиться к тому же URL. Если вы хотите контролировать логику на сервере, используйте .retry() или .onErrorResume() в потоке Flux.

• 🔒 Безопасность

При необходимости защищайте URL SSE с помощью авторизации (JWT, OAuth2) или rate-limit’а, чтобы злоумышленники не «залили» ресурс.

• 📈 Масштабирование

Благодаря реактивной модели WebFlux вы можете легко масштабировать приложение на Kubernetes, не опасаясь, что сотни SSE-потоков «съедят» память и потоки.

• Где применить?

• Живые обновления статуса задач и билдов (CI/CD, DevOps)

• Чат-сообщения или лента комментариев в режиме «реального времени»

• Мониторинг метрик и дашборды (оперативные алерты)

• Финансовые или спортивные котировки (ticker, live scores)

• Оповещения об изменениях в БД (CDC), когда нужен асинхронный пуш

@javarush