GH GambleHub

Batch vs Stream: коли що

Навіщо взагалі вибирати

Будь-яка система даних балансує між свіжістю (latency), вартістю, складністю підтримки і надійністю.
Batch - періодичні «порції» даних з високою пропускною здатністю і низькою вартістю за запис.
Stream - безперервна обробка подій з мінімальною затримкою і станом в пам'яті/локальних сторах.


Коротко про моделі

Batch

Джерело: файли/таблиці/снапшоти.
Тригер: розклад (година/день) або умова (новий паркет-файл).
Сильні сторони: простота, детермінізм, повний контекст даних, дешеві великі перерахунки.
Слабкі: немає «онлайну», висока латентність, «вікна» без сигналів реального часу.

Stream

Джерело: брокери (Kafka/NATS/Pulsar), CDC, черги.
Тригер: подія.
Сильні: низька затримка, реактивність, природна інтеграція з продуктом.
Слабкі: складність часу (event vs processing), порядок/дублі, стан, експлуатація.


Рішення: матриця вибору

КритерійBatchStream
Необхідна свіжість≥ хвилин/годинсекунд/суб-секунд
Обсяг перерахунківВеликі історичніІнкрементальні
ВартістьНижче при великих обсягахВище за «постійну готовність»
СкладністьНижчеВище (state, вікна, watermark)
Налаштування заднього числаПриродніПотрібні retract/upsert
Стабільність вхідного форматуВисокаМожуть бути «брудні» події
Критичність «рівно один ефект»Легко в транзакціїВимагає ідемпотентності/EOS
Продуктовий UX (реал-тайм)НепридатнийПриродно

Правило 80/20: якщо SLA дозволяє хвилинні/годинні затримки і немає реактивних фіч - беріть batch. Якщо критична реакція «тут і зараз» або потрібні живі вітрини - stream (часто + додатковий нічний batch для вивірки).


Типові сценарії

Batch - коли краще:
  • Щоденна звітність, білінг періодами, ML-тренінг, великі джоїни, дедуплікація «всім набором».
  • Медальйон-модель (bronze/silver/gold) з глибокими валідаціями.
  • Масові бектести і перезбірка вітрин.
Stream - коли краще:
  • Антифрод/моніторинг, алерти SRE, real-time баланс/місії, рекомендації «зараз».
  • Інтеграції «подія-як-факт» (EDC), оновлення матеріалізованих уявлень (CQRS).
  • Мікросервіси: нотифікації, вебхуки, реакції на бізнес-події.
Гібрид - найчастіше:
  • Потік формує операційні вітрини і сигнали; нічний batch робить вивірку, звід і дешеві історичні перерахунки.

Архітектури

Lambda (Stream + Batch)

Stream для інкременту та онлайну; Batch для повноти і корекцій.
Плюси: гнучкість і SLA. Мінуси: подвійна логіка, дублювання коду.

Kappa (все — Stream + Replay)

Єдиний лог як джерело істини; batch-перерахунки = replay.
Плюси: одна кодова база, єдина семантика. Мінуси: складніше експлуатація, вимоги до зберігання логу.

Hybrid-Pragmatic

Потокова «операційка» + періодичні batch-джоби для важких джоїнів/ML/корекцій.
На практиці - найпоширеніший варіант.


Час, порядок, вікна (для Stream)

Спирайтеся на event time, не на processing time.
Керуйте watermark і'allowed _ lateness'; підтримуйте retractions/upserts для пізніх подій.
Партіонуйте по ключах агрегатів, плануйте «гарячі ключі».


Надійність і семантика ефектів

Batch

Транзакції БД або атомарна заміна партій/таблиць.
Ідемпотентність - через deterministic-обчислення і overwrite/insert-overwrite.

Stream

At-least-once + ідемпотентні sinks (upsert/merge, версії агрегатів).
Транзакційний «прочитав-записав-зафіксував позицію» для EOS за ефектом.
Таблиці дедупа по'event _ id '/' operation _ id'.


Сховища та формати

Batch

Data Lake (Parquet/Delta/Iceberg), OLAP (ClickHouse/BigQuery), об'єктне сховище.
ACID-таблиці для atomic replace, time travel.

Stream

Логи/теми в брокерах, state stores (RocksDB/embedded), KV/Redis, OLTP для проекцій.
Реєстр схем (Avro/JSON/Proto), режими сумісності.


Вартість і SLO

Batch: оплачуєте «пачками» - вигідно при великих обсягах, але затримка ≥ розкладу.
Stream: постійні рантайм-ресурси, пікова вартість при високому QPS; зате SLA в секундах.
Вважайте p95/p99 latency, наскрізний лаг, вартість в у.о./подія і TCO підтримки.


Тестування

Загальне: golden-набори, property-based інваріанти, генерація брудних входів.
Batch: детермінованість, ідемпотентні перезапуски, порівняння склепінь «до/після».
Stream: out-of-order/дублікати, fault-injection між ефектом і фіксацією офсету, replay-тести.


Обсервабіліті

Batch: тривалість джоб, частка фейлів/ретраїв, свіжість вітрин, скан-cost.
Stream: лаг за часом/повідомленнями, watermark, late-rate, розмір state/частота checkpoint, DLQ-ставка.
Скрізь: 'trace _ id','event _ id', версії схем/конвеєрів.


Безпека та дані

PII/PCI - мінімізувати, шифрувати at-rest/in-flight, мітити поля в схемах ('x-pii').
Для Stream - захист state/checkpoint'ів, ACL на топіки.
GDPR/право на забуття: в Stream - крипто-стирання/редакція в проекціях; в Batch - перерахунок партій.


Перехідні стратегії

Batch → Stream: почніть з публікації подій (Outbox/CDC), підніміть невелику вітрину real-time, не чіпаючи існуючий звід.
Stream → Batch: додайте щоденні зведення для звітності/вивірки і зниження навантаження на потокові sinks.


Анти-патерни

«Все в Stream» заради моди: дорого і складно без реальної потреби.
«Один гігантський нічний batch» при вимогах <5 хвилин.
Використання processing time для бізнес-метрик.
Сирі CDC як публічні події: жорстка зв'язність, біль при еволюції.
Немає ідемпотентності в sinks → подвійні ефекти на рестартах.


Чек-лист вибору

  • SLO свіжості: скільки секунд/хвилин/годин допустимо?
  • Стабільність входів: чи є out-of-order/дублікати?
  • Чи потрібні онлайнові реакції/вітрини?
  • Вартість: рантайм 24/7 vs «вікно за розкладом».
  • Спосіб корекцій: retract/upsert або нічний перерахунок.
  • Команда і операційна зрілість (обсервабіліті, on-call).
  • Вимоги до «рівно одного ефекту».
  • Політики PII/ретенції/право на забуття.

Референс-патерни

Операційна вітрина (Hybrid):
  • Stream: EDC → проекції (KV/Redis, OLTP) для UI, ідемпотентні upsert.
  • Batch: nightly звід в OLAP, reconciliation, ML-фічі.
Антифрод:
  • Stream: session-вікна, CEP-правила, алерти <1-5 с.
  • Batch: перенавчання моделей, офлайн-валідація.
Маркетинг/CRM:
  • Stream: тригери, сегменти в реальному часі.
  • Batch: скоринги, LTV-моделі, звіти.

FAQ

Чи можна отримати «майже real-time» на batch?
Так: мікробатчі/тригерні джоби (кожні 1-5 хвилин) - компроміс, але без складнощів вікон/late-events.

Чи потрібен Lambda-підхід скрізь?
Ні, ні. Якщо потік закриває всі завдання і ви вмієте робити replay - Kappa простіше в довгу. Інакше - гібрид.

Як рахувати вартість?
Підсумовуйте compute + storage + ops. Для Stream додайте ціну простою «24/7» і аварійних ночей; для Batch - ціну «прострочення» даних.


Підсумок

Вибирайте Batch, коли важливі низька вартість, простота і періодичні склепіння; Stream - коли критична реактивність і свіжість. На практиці перемагає гібрид: потік - для онлайну і сигналів, батч - для повноти і дешевих історичних перерахунків. Головне - задати SLO, забезпечити ідемпотентність/спостережуваність і заздалегідь спроектувати шлях корекцій.

Contact

Зв’яжіться з нами

Звертайтеся з будь-яких питань або за підтримкою.Ми завжди готові допомогти!

Розпочати інтеграцію

Email — обов’язковий. Telegram або WhatsApp — за бажанням.

Ваше ім’я необов’язково
Email необов’язково
Тема необов’язково
Повідомлення необов’язково
Telegram необов’язково
@
Якщо ви вкажете Telegram — ми відповімо й там, додатково до Email.
WhatsApp необов’язково
Формат: +код країни та номер (наприклад, +380XXXXXXXXX).

Натискаючи кнопку, ви погоджуєтесь на обробку даних.