Перейти к содержанию

Для чего нужен стриминг?

Итак, для чего нужен стриминг? Или, если задать вопрос точнее, для чего нужен стриминг в SignalR? Ведь постоянное соединение уже установлено. Почему бы просто не отправлять каждый элемент коллекции в тот момент, когда он становится доступен? Однако, существуют сценарии, когда стриминг необходим, даже в SignalR.
Сперва рассмотрим один из самых распространённых сценариев — передачу видеоданных. Когда вы смотрите видео, браузер (или другое приложение) не загружает весь файл целиком. Вместо этого загрузка происходит маленькими кусочками, чего вы, как зритель, даже не замечаете (пока загрузка кусочка происходит быстрее, чем его просмотр).
Также существует ситуация, когда такого понятия как “весь видеофайл” просто нет. Например, камеры наблюдения производят бесконечный поток видеоданных. И также обстоят дела с любым другим “прямым эфиром” (live streaming). Потребители просто получают кусочки данных, пока камера снимает. И единственным выходом здесь будет использование стриминга.

Почему сырые данные нельзя отправлять отдельными сообщениями

Как мы видели в главе 4, каждое сообщение в SignalR обёрнуто в JSON. Соответственно, если требуется передать большое число сообщений за короткий период времени (а это неизбежно в случае передачи видео) — такой оверхэд будет крайне нежелателен, как из-за необходимости передачи избыточных данных, так и из-за необходимости использовать дополнительные вычислительные мощности для парсинга этих данных.
Еще одна трудность — так как мы имеем дело с сырым (raw) потоком байт, достаточно тяжело объединить маленькие кусочки в нужном порядке в случае, когда на каждый кусочек будет выполнятся отдельный обработчик приходящего сообщения.
Стриминг значительно упрощает этот процесс — данные обрабатываются в том же порядке, в котором и приходят потребителю. Также, до тех пор, пока канал передачи данных открыт — нет причин засорять его дополнительными метаданными.

Почему стриминг коллекций также имеет смысл в SignalR

В отличие от того же gRPC, где стриминг является единственным доступным способом отправить сообщение без запроса от клиента, в SignalR это реализовано по умолчанию. Однако, стриминг коллекций также имеет смысл при использовании в SignalR.
Как и в случае с сырым потоком байтов, передача элементов коллекции в потоке сокращает избыточность метаданных и сохраняет порядок при передаче.


Последнее обновление : 14 июня 2023 г.
Дата создания : 18 января 2023 г.

Комментарии

Комментарии