В чем разница micro-butching и streaming?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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()
Как работает:
- События накапливаются в течение 10 сек
- Spark запускает batch job обработку
- Результаты пишутся
- Новый батч начинается
Достоинства:
- Масштабируемость (петабайты через распределённые батчи)
- 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)
Как работает:
- Событие поступает в Kafka
- Consumer читает мгновенно (< 1ms)
- Обработка начинается сразу
- Результат в sink за 10-50ms
Достоинства:
- Истинное реальное время (< 100ms latency)
- Immediate alerts и fraud detection
- Простой для понимания код
- Stateful operations легко
- Может работать на одной машине
Недостатки:
- Сложнее масштабировать (нужны шарды)
- Fault tolerance ручная
- Нет встроенных оптимизаций
- SQL сложнее
- Может быть waste ресурсов
Сравнение
| Параметр | Micro-batching | Streaming |
|---|---|---|
| Latency | 10-30s | < 100ms |
| Throughput | 100k+ events/sec | 10k-100k events/sec |
| Масштабируемость | Отличная | Сложнее |
| Fault tolerance | Встроена | Ручная |
| SQL support | Native | Сложнее |
| Сложность кода | Средняя | Низкая |
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 = истинное реальное время, сложнее масштабировать.
Лучшие системы используют оба одновременно.