Перейти к основному содержимому

Реактивные системы и потоки данных

Всем

Реактивная коммуникация

Что такое реактивная коммуникация?

Реактивная система — это когда программа не ждёт, когда её попросят, а сама реагирует на события по мере их поступления.

Ключевое слово - реактивно, то есть, сразу. Вы сидите с другом в комнате, друг говорит и вы сразу слышите, не нужно спрашивать.

В реактивном типе постоянный канал открыт, а данные текут туда-обратно сами. Например, в чатах, биржевых котировках, видеозвонках.

Когда вы печатаете сообщение в Telegram, и отправляете:

  • открывается постоянный канал связи (WebSocket), между твоим телефоном и сервером Telegram;
  • сервер сразу видит сообщение;
  • сервер тут же отправляет его собеседнику;
  • собеседник видит сообщение мгновенно, через доли секунды.

Когда данные текут сплошным потоком, например, 1000 событий в секунду, их надо как-то обрабатывать на лету. Для этого используют потоковые операторы:

  • Map (преобразование);
  • Filter (фильтрация);
  • Reduce (агрегация);
  • FlatMap (разворачивание).

Реактивный подход, например, используется в World of Warcraft. Все действия игроков передаются мгновенно.

Google Docs, кстати - вы печатаете, а другой человек видит каждую букву.

Реактивность не подойдёт, если:

  • событий мало (раз в минуту);
  • ответ должен быть точным и строгим;
  • команда не знает реактивное программирование;
  • система и так работает быстро.

Как работает реактивная коммуникация?

Реактивные взаимодействия фокусируются на обмене событиями в режиме реального времени. Системы реагируют на события по мере их возникновения, обеспечивая непрерывный поток данных.

Транспорт:

  • WebSockets
  • SSE
  • Kafka Streams
  • MQTT

WebSockets является самым распространённым представителем реактивной коммуникации, ведь устанавливается двусторонний канал связи между клиентом и сервером, который позволяет обмениваться данными в реальном времени. Это протокол для двусторонней связи между клиентом и сервером через единственный постоянный канал. После установления соединения данные передаются без дополнительных HTTP-заголовков.

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. На практике это обработка событий в реальном времени (например, подсчёт количества кликов пользователей).

Kafta и MQTT - не только асинхронные протоколы, но и реактивные.

Реактивные системы обеспечивают мгновенный обмен данными, и они подходят для работы с большим количеством событий и пользователей. Такое можно встретить в чатах, онлайн-играх, биржевых платформах, системах мониторинга.


См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).