← Назад к вопросам

В чем разница micro-butching и streaming?

1.7 Middle🔥 191 комментариев
#Apache Kafka и потоковая обработка

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Micro-batching vs Streaming

Два принципиально разных подхода для обработки потоков данных в реальном времени.

Micro-batching (Apache Spark Structured Streaming)

Разбить входящий поток на маленькие батчи (100ms-5s) и обрабатывать их как batch jobs.

from pyspark.sql import SparkSession
from pyspark.sql.functions import window, sum, count

spark = SparkSession.builder.appName("MicroBatching").getOrCreate()

df = spark.readStream.format("kafka").option("kafka.bootstrap.servers", "kafka:9092").option("subscribe", "events").load()

query = df.groupBy(
    window(df.timestamp, "10 seconds"),
    df.user_id
).agg(
    count("*").alias("event_count"),
    sum("amount").alias("total")
).writeStream.format("console").option("checkpointLocation", "/tmp/checkpoint").start()

Как работает:

  1. События накапливаются в течение 10 сек
  2. Spark запускает batch job обработку
  3. Результаты пишутся
  4. Новый батч начинается

Достоинства:

  • Масштабируемость (петабайты через распределённые батчи)
  • Catalyst optimizer из Spark
  • Встроенная fault tolerance через checkpointing
  • Native SQL support
  • Хорошо загружает cluster ресурсы

Недостатки:

  • Latency 10-30 сек (E2E delay)
  • Не истинный streaming
  • Сложнее с stateful операциями

Streaming (Kafka Consumer)

Обрабатывать каждое событие немедленно при прибытии.

from kafka import KafkaConsumer
import json
from redis import Redis

consumer = KafkaConsumer(
    'events',
    bootstrap_servers=['kafka:9092'],
    value_deserializer=lambda x: json.loads(x),
    auto_offset_reset='latest',
    group_id='realtime-processor'
)

red = Redis(host='redis')

for message in consumer:
    event = message.value
    user_id = event['user_id']
    amount = event['amount']
    
    # Обновляй в реальном времени
    red.incr(f"user:{user_id}:event_count")
    red.incrbyfloat(f"user:{user_id}:daily_total", amount)
    
    # Проверка fraud
    daily_total = float(red.get(f"user:{user_id}:daily_total") or 0)
    if daily_total > 10000:
        alert_fraud(user_id)

Как работает:

  1. Событие поступает в Kafka
  2. Consumer читает мгновенно (< 1ms)
  3. Обработка начинается сразу
  4. Результат в sink за 10-50ms

Достоинства:

  • Истинное реальное время (< 100ms latency)
  • Immediate alerts и fraud detection
  • Простой для понимания код
  • Stateful operations легко
  • Может работать на одной машине

Недостатки:

  • Сложнее масштабировать (нужны шарды)
  • Fault tolerance ручная
  • Нет встроенных оптимизаций
  • SQL сложнее
  • Может быть waste ресурсов

Сравнение

ПараметрMicro-batchingStreaming
Latency10-30s< 100ms
Throughput100k+ events/sec10k-100k events/sec
МасштабируемостьОтличнаяСложнее
Fault toleranceВстроенаРучная
SQL supportNativeСложнее
Сложность кодаСредняяНизкая

Real-world примеры

Micro-batching: Логирование, метрики, ETL пайплайны (задержка ok)

Streaming: Fraud detection, real-time alerts, live dashboards (критична latency)

Гибридный подход

Kafka
├─> Streaming Consumer (низкие latency)
│   └─> Redis (real-time dashboards)
└─> Micro-batching (Spark, каждую минуту)
    └─> ClickHouse (analytics)

Пример: Платёжная система

  • Streaming: Мгновенная проверка fraud (< 100ms)
  • Micro-batching: Агрегация метрик, RPM графики (каждую минуту)

Выбор

Micro-batching: Нужна масштабируемость, ок задержка 10-30 сек, используешь Spark

Streaming: Критична latency < 100ms, нужны immediate alerts, относительно мал volume

Итог

Micro-batching = батчи в цикле, масштабируемо, latency на уровне минут. Streaming = истинное реальное время, сложнее масштабировать.

Лучшие системы используют оба одновременно.