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

Асинхронная коммуникация между сервисами

Всем

Асинхронная коммуникация

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

Порой ответ не нужен. Точнее, ждать его нет нужды - отправили сообщение и забыли, не ждём ответа, идём по своим делам. А ответ придёт потом сам. Это асинхронность.

Play ITЗагрузка интерактивного демо…

Технически, в таком случае используется посредник - очередь сообщений, брокер.

Программа А → ОЧЕРЕДЬ (RabbitMQ/Kafka) → Программа Б
  • Программа А говорит "кладу в очередь сообщение";
  • очередь говорит "сохранила, пусть лежит";
  • Программа Б говорит "когда освобожусь, достану сообщение из очереди и обработаю".

Асинхронная коммуникация решает проблемы синхронной:

  • в асинхронной связи сообщение полежит в очереди, пока упавший сервер не починят;
  • программа А будет ждать, а не тормозить, если Б тормозит (они не зависят друг от друга);
  • Б не успевает за потоком запросов? Очередь работает как буфер, сообщения копятся;
  • надо отправить данные в 5 разных систем? Одно сообщение в очередь, 5 подписчиков его разбирают.
1. Клиент → Веб-сервер: "Хочу заказ, вот мои данные"
2. Веб-сервер → Клиент: "Заказ принят, спасибо!" (мгновенно)
3. Веб-сервер кладёт сообщение в RabbitMQ: "Новый заказ #123"
4. Веб-сервер идёт обрабатывать другие запросы

--- Через пару секунд ---
5. Сервис обработки заказов берёт сообщение из очереди
6. Сервис резервирует товар на складе
7. Сервис списывает деньги
8. Сервис отправляет письмо клиенту: "Заказ подтверждён"

(Клиент получил письмо через минуту, но не сидел с крутящимся прелоадером всё это время)

В асинхронной связи:

  • нет мгновенного ответа, и если надо знать результат прямо сейчас, то асинхронность не подойдёт;
  • сложнее отлаживать, потому что сообщение уходит в очередь, и непонятно где ошибка;
  • нужен брокер (RabbitMQ/Kafka), это дополнительный компонент, который надо администрировать;
  • гарантии доставки настраиваются;
  • идемпотентность — при повторной доставке обработчик не должен дублировать эффект. Hub-статья с семантикой at-least-once и effectively exactly-once — Идемпотентность и семантика доставки. Для HTTP — заголовок Idempotency-Key в главе HTTP.

Об асинхронном транспорте

Мы уже изучали асинхронность, поэтому можем уже понять, что асинхронная коммуникация — это способ взаимодействия, при котором отправитель не ждёт немедленного ответа от получателя. Это особенно важно в распределённых системах, где синхронные вызовы могут привести к задержкам или блокировкам. При таком решении используется либо очередь, либо события. Мы их ранее рассматривали вкратце.

Примерами асинхронного взаимодействия может являться:

  • SMTP, отправка электронной почты. Клиент отправляет письмо, но не ждёт подтверждения его доставки получателю.
  • JMS (Java Message Service), использование очередей сообщений для передачи данных между системами.
  • RabbitMQ/Kafka, брокеры

Очереди сообщений (Message Queues или MQ) подразумевает, что сообщения помещаются в очередь, и сервисы обрабатывают их по мере готовности. Примеры решений - RabbitMQ, Apache Kafka, Amazon SQS. Используется для задач, которые могут выполняться в фоновом режиме (например, отправка email).

Транспорт в асинхронной коммуникации:

  • SMTP;
  • AMQP;
  • MQTT;
  • Kafka.

SMTP (Simple Mail Transfer Protocol) — это протокол для отправки электронной почты. Он используется для передачи сообщений между почтовыми серверами или от клиента к серверу. Письмо отправляется, но доставка может занять время. Для повторной отправки в случае сбоя используются очереди.

image-10.png

MQTT (Message Queuing Telemetry Transport) — лёгкий протокол pub/sub для передачи данных при ограниченной пропускной способности или нестабильном соединении. Часто используется в IoT. Издатель публикует сообщение в брокер по теме; подписчик получает только те темы, на которые подписался — без прямого соединения с издателем.

image-11.png

AMQP (Advanced Message Queuing Protocol) — открытый протокол надёжной асинхронной доставки через брокер (например, RabbitMQ). Producer отправляет сообщение в exchange; exchange маршрутизирует его в одну или несколько очередей; consumer забирает сообщения из очереди, когда готов обработать.

Apache Kafka — это платформа для потоковой передачи данных. Она позволяет системам обмениваться событиями в реальном времени. Kafka и RabbitMQ мы разберём отдельно.

Обзор восьми архитектурных стилей API (включая MQTT и AMQP) — карта стилей.


См. также

Продолжение темы в разделе "Инфраструктура и безопасность" — асинхронная коммуникация.