⚡ Синхрон, асинхрон, стриминг — в чём разница и когда что выбирать? ⚡
Про эти виды обмена данными постоянно спрашивают СА и БА на собеседованиях.
Разбираю на примерах #MedAssistGA.
📌 Синхронный обмен
Отправили запрос — ждём ответа, только потом идём дальше.
Когда нужен:
результат нужен прямо сейчас, чтобы продолжить сценарий.
Примеры:
▫️ GET /doctors — запросили список врачей, ждём, показываем пользователю
▫️ GET /schedule — запросили слоты, ждём, показываем пользователю расписание
▫️ POST /appointments — создали запись, ждём подтверждения от сервиса, показываем пользователю
Здесь нельзя идти дальше без ответа.
Синхрон — единственный вариант.
📌 Асинхронный обмен
Отправили сообщение — не ждём ответа, продолжаем работу.
Результат получим позже.
Когда нужен:
результат не нужен мгновенно,
запрос "тяжелый" (занимает много времени) и важна надёжность обработки.
Пример из #MedAssistGA:
1. Врач запрашивает сводный отчёт по приёмам за месяц POST /reports/appointments
2. Система принимает запрос, кладёт задачу в очередь к обработке (RabbitMQ/Kafka) и сразу возвращает HTTP-201 со статусом "отчет формируется" и id будущего отчета.
3. Врач продолжает работу в системе.
4. Когда отчёт готов, Сервис Уведомлений присылает push или email со ссылкой на скачивание.
Суть: мы не "крутим кружок" и не держим соединение открытым, пока система собирает данные. Пользователь может делать что угодно. А по готовности просто зайти и скачать итоговый результат.
📌 Стриминг (SSE и WebSocket — API реального времени)
Данные передаются не одним ответом, а потоком.
Соединение остаётся открытым на время передачи ответа.
SSE (Server-Sent Events) — однонаправленный поток сервер → клиент. Работает поверх обычного HTTP.
Пример из #MedAssistGA:
1. Пользователь задал вопрос в чате
2. AI Chat Service направил его в Groq
3. Groq генерирует ответ токен за токеном (слово за словом) и возвращает по SSE
4. AI Chat Service получает поток и передаёт его дальше во фронт, тоже через SSE
5. Пользователь видит текст по мере появления, не ждёт полного ответа.
📌 WebSocket — двусторонний канал, обе стороны инициируют сообщения.
В #MedAssistGA его нет — но если добавим онлайн-чат врач–пациент, появится WebSocket.
Пользователь сможет писать сообщения в чат и сразу получать новые сообщения от сервера без обновления страницы. Соединение между Frontend и Backend будет оставаться открытым, поэтому сервер сможет доставлять новые сообщения на экран в реальном времени.
👉 Как выбирать
▫️ Результат нужен сейчас → синхронный REST
▫️ Задача долгая или результат не нужен мгновенно → асинхронный (Kafka, RabbitMQ)
▫️ Сервер передаёт данные клиенту потоком → SSE
▫️ Обе стороны обмениваются в реальном времени → WebSocket
#ИнтеграцииGA
📱 Tg | 💙 ВК | 💬 Max
Post #3469
3.19K

- 👍 15
- ❤🔥 8
- ❤ 4
- 🔥 3