В чем разница между micro-batching и streaming?

Ответ

Micro-batching — это подход, при котором данные накапливаются небольшими порциями (батчами) в течение короткого фиксированного интервала (например, 500 мс или 1 секунда), а затем обрабатываются как единый блок. Streaming — это обработка каждого события или записи по мере их поступления, практически без задержки.

Ключевые различия на примере Apache Kafka и фреймворков обработки:

Аспект Micro-batching (например, Spark Structured Streaming) True Streaming (например, Apache Flink, Kafka Streams)
Задержка (Latency) Выше (сотни миллисекунд - секунды), так как данные ждут закрытия окна батча. Минимальная (миллисекунды), события обрабатываются сразу.
Модель обработки Дискретная, по тактам. Приложение «просыпается» для обработки накопленного батча. Непрерывная, операторы обрабатывают поток событий постоянно.
Семантика доставки Проще обеспечить exactly-once благодаря детерминированным интервалам и checkpoint'ам на уровне батча. Требует более сложных механизмов (водяные знаки, распределенные снапшоты) для гарантии exactly-once.
Пропускная способность Может быть выше за счет оптимизации обработки групп записей и снижения накладных расходов. Нагрузка более равномерная, но overhead на обработку каждого события может быть выше.

Пример концептуального кода для Kafka:

  • Micro-batching (Spark):

    val df = spark.readStream
      .format("kafka")
      .option("subscribe", "topic")
      .load() // Данные читаются микробатчами
  • Streaming (Kafka Streams):

    KStream<String, String> stream = builder.stream("input-topic");
    stream.mapValues(value -> value.toUpperCase()) // Преобразование применяется к каждому событию сразу
          .to("output-topic");

Выбор подхода зависит от требований: streaming для низкой задержки (мониторинг, алертинг), micro-batching для высокой пропускной способности при приемлемой задержке (ETL, агрегации).

Ответ 18+ 🔞

Давай разберем эту тему, а то у некоторых в голове уже ёперный театр начинается с этими стримами и батчами.

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

Если брать наши технологии, то Spark Structured Streaming — это тот самый хозяйственный мужик с ведром. Он просыпается по будильнику (раз в 500 мс, секунду), сгребает всё, что натекло за это время, в кучу и начинает обрабатывать. Задержка, конечно, есть — где-то от сотен миллисекунд. Зато ему проще гарантировать, что каждая капля учтётся ровно один раз (exactly-once), потому что он ставит галочки после каждого полного ведра. Пропускная способность часто выше, потому что оптимизировать обработку пачки данных проще, чем возиться с каждой единичной операцией.

А вот Apache Flink или Kafka Streams — это уже классические стримеры, которые нихуя не ждут. Событие пришло? Щас же его и обработали. Задержка — минимальная, что и нужно для всяких систем алертинга, где каждая миллисекунда на счету. Но и возни с гарантиями доставки у них больше, потому что следить за каждой каплей — то ещё удовольствие.

Код, блядь, чтобы было понятнее:

  • Микробатчинг (Spark) — «Подожди секунду, щас всё обработаю»:

    val df = spark.readStream
      .format("kafka")
      .option("subscribe", "topic")
      .load() // Данные читаются микробатчами

    Видишь readStream? Он читает не по одному сообщению, а пачками, с интервалами. Всё по расписанию.

  • Настоящий стриминг (Kafka Streams) — «Пришло? Обрабатывай!»:

    KStream<String, String> stream = builder.stream("input-topic");
    stream.mapValues(value -> value.toUpperCase()) // Буквально щас, на лету
          .to("output-topic");

    Тут stream — это и есть непрерывный поток. Операция mapValues применяется к каждому сообщению мгновенно, как только оно припёрлось.

Так что же выбрать, ёпта? Всё упирается в твои аппетиты.

  • Нужно мониторить транзакции в реальном времени и ловить мошенников, пока они не смылись? Тебе стриминг. Низкая задержка — святое.
  • Делаешь ежедневные/ежечасные агрегаты для дашборда или ETL-пайплайн, где секундная задержка — не проблема? Бери микробатчинг. Пропускная способность будет выше, а голова болеть — меньше.

Короче, нет серебряной пули. Есть задача — под неё и инструмент. Главное — не пытайся на Flink'е делать суточные сводки, а на Spark'е — детектировать аномалии в режиме реального времени. Получится пиздопроебибна и неэффективно.