Передавайте через очередь небольшие ссылки на блоки, а большие данные храните отдельно; применяйте streaming, ограниченные буферы и backpressure. Уточните допустимость потерь при at-most-once.
Улучшение скорости передачи и обработки массивных потоков данных
Передавайте через очередь небольшие ссылки на блоки, а большие данные храните отдельно; применяйте streaming, ограниченные буферы и backpressure. Уточните допустимость потерь при at-most-once.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Сервис принимает сетевой поток размером 2 ГБ, разбивает его на куски по 1 МБ, разрывая только на границе символа переноса строки, и помещает полученные блоки в очередь. Несколько реплик подписываются на эту очередь и обрабатывают данные, соблюдая гарантию «не более одного раза». Какие стратегии можно применить, чтобы повысить скорость обработки и передачи этих данных?
Ответ
Передавайте через очередь небольшие ссылки на блоки, а большие данные храните отдельно; применяйте streaming, ограниченные буферы и backpressure. Уточните допустимость потерь при at-most-once.
Измерьте узкое место: сеть, копирование, компрессию, брокер или обработчики. Не держите весь поток 2 ГБ в памяти. Выделяйте блоки последовательно, сохраняя границы строк; отдельно определите поведение строки длиннее 1 МБ.
Крупные payload можно заменить ссылками на неизменяемые блоки в объектном хранилище с checksum и сроком хранения. Реплики читают разные блоки, размер партии и степень конкурентности подбираются по измерениям. Компрессия помогает лишь при подходящем соотношении CPU и сети.
At-most-once допускает потерю после выдачи сообщения и сбоя worker. Если данные терять нельзя, нужен иной контракт: повторная доставка с идемпотентной обработкой, а не обещание одновременно отсутствия повторов и потерь.