Реактивные системы и потоки данных
Реактивная коммуникация
Что такое реактивная коммуникация?
Слово "реактивный" в IT означает разное — полезно различать:
| Термин | О чём речь | Пример |
|---|---|---|
| Reactive Manifesto | свойства системы: отзывчивость, устойчивость, эластичность, асинхронные сообщения | микросервисы с очередями и мониторингом |
| Реактивное программирование | потоки событий и операторы (map, filter, reduce) | RxJava, Project Reactor, Kafka Streams |
| Долгоживущий канал | постоянное соединение, данные идут сразу | WebSocket, SSE, видеозвонок |
В этой главе речь в основном о каналах и потоках событий (нижние две строки). Манифест — про архитектуру целиком; его ближе раскрывают в материалах по распределённым системам.
Реактивная система в бытовом смысле — когда программа не ждёт, когда её попросят, а сама реагирует на события по мере их поступления.
Ключевое слово - реактивно, то есть, сразу. Вы сидите с другом в комнате, друг говорит и вы сразу слышите, не нужно спрашивать.
Play ITЗагрузка интерактивного демо…
В реактивном типе постоянный канал открыт, а данные текут туда-обратно сами. Например, в чатах, биржевых котировках, видеозвонках.
Когда вы печатаете сообщение в Telegram, и отправляете:
- открывается постоянный канал связи (WebSocket), между твоим телефоном и сервером Telegram;
- сервер сразу видит сообщение;
- сервер тут же отправляет его собеседнику;
- собеседник видит сообщение мгновенно, через доли секунды.
Когда данные текут сплошным потоком, например, 1000 событий в секунду, их надо как-то обрабатывать на лету. Для этого используют потоковые операторы:
- Map (преобразование);
- Filter (фильтрация);
- Reduce (агрегация);
- FlatMap (разворачивание).
Реактивный подход, например, используется в World of Warcraft. Все действия игроков передаются мгновенно.
Google Docs, кстати - вы печатаете, а другой человек видит каждую букву.
Реактивность не подойдёт, если:
- событий мало (раз в минуту);
- ответ должен быть точным и строгим;
- команда не знает реактивное программирование;
- система и так работает быстро.
Как работает реактивная коммуникация?
Реактивные взаимодействия фокусируются на обмене событиями в режиме реального времени. Системы реагируют на события по мере их возникновения, обеспечивая непрерывный поток данных.
Транспорт:
- WebSockets
- SSE
- Kafka Streams
- MQTT
WebSocket — самый распространённый транспорт для дуплексного канала между клиентом и сервером: после короткого HTTP‑рукопожатия открывается постоянное TCP‑соединение, по которому обе стороны шлют фреймы без повторных HTTP‑заголовков на каждое сообщение. Подробно — протокол, фреймы, типичные ошибки и примеры кода — в статье Реактивная коммуникация.
Кратко по сравнению с остальным транспортом в этом списке:
- WebSocket — клиент и сервер пишут друг другу в любой момент (чаты, игры, коллаборация).
- SSE — удобен, когда поток нужен от сервера к браузеру по обычному HTTP.
- Kafka Streams / MQTT — связывают сервисы и устройства через брокера; это другой слой, не замена каналу "браузер ↔ ваш API".
Server-Sent Events (SSE) предполагает, что сервер отправляет обновления клиенту через однонаправленный канал, это протокол для однонаправленной передачи данных от сервера к клиенту через HTTP. Сервер отправляет данные клиенту, но обратная связь невозможна. Если соединение разрывается, клиент автоматически переподключается. Пример - трансляция обновлений и уведомления в реальном времени.
Event Streaming — это потоковые платформы, такие как Apache Kafka, позволяют системам подписываться на события и реагировать на них. Потоковые операторы — это инструменты для обработки потоков данных в реальном времени. Они позволяют выполнять преобразования, фильтрацию и агрегацию данных. Примеры потоковых операторов:
- Map - преобразует каждый элемент потока. Пример - увеличить все числа в потоке на 1:
stream.map(x => x + 1);
- Filter - отбирает только те элементы, которые удовлетворяют условию. Пример - оставить только положительные числа:
stream.filter(x => x > 0);
- Reduce - агрегирует данные в один результат. Пример - подсчитать сумму всех чисел в потоке:
stream.reduce((acc, x) => acc + x, 0);
- FlatMap - преобразует каждый элемент в несколько элементов. Пример - разбить строку на слова:
stream.flatMap(sentence => sentence.split(' '));
Потоковые операторы в интеграции используются как раз в Apache Kafka Streams. На практике это обработка событий в реальном времени (например, подсчёт количества кликов пользователей).
Kafka и MQTT часто используют в асинхронных и потоковых сценариях (очереди, телеметрия, обработка событий). Их не путайте с WebSocket: брокер не заменяет постоянный канал "браузер ↔ сервер", но хорошо связывает сервисы между собой.
Реактивные системы обеспечивают быстрый обмен данными и подходят для большого числа событий и пользователей. Такое можно встретить в чатах, онлайн-играх, биржевых платформах, системах мониторинга.
См. также
Продолжение темы в разделе "Инфраструктура и безопасность" — реактивная коммуникация.
Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.