GH GambleHub

Event-Streaming і real-time дані

(Розділ: Технології та Інфраструктура)

Коротке резюме

Event-Streaming - це обробка і доставка подій в момент їх появи. Для iGaming це означає миттєву реакцію на ставки, депозити, антифрод-сигнали, ліміти відповідальної гри, турнірні таблиці та персональні оффери. Базові цеглини: шина подій (Kafka/Pulsar), рушій потокової обробки (Flink/ksqlDB/Spark Structured Streaming), CDC з транзакційних БД (Debezium), Feature Store для онлайн-ML і real-time аналітика (матеріалізовані уявлення, OLAP).

Де це критично в iGaming

Антифрод & ризик: скоринг транзакцій в <100-300 мс, кореляція поведінкових патернів, блокування та ескалації.
Відповідальна гра: контроль лімітів, швидкість втрат, аномальна поведінка - алерти і авто-обмеження в реальному часі.
Платежі: статусні вентили, webhooks PSP, smart-retry, проекції балансів, SLA «time-to-wallet».
Ігрові івенти: розрахунок лідерів турнірів (sliding вікна), раунди live-ігор, real-time стрічки для CRM/маркетингу.
Персоналізація: онлайн-фічі (RFM, propensity) → тригерні кампанії, push/email протягом секунд.
Оперативна аналітика: p95/p99 latency, конверсія кроків воронки, health-сигнали платформи.

Архітектурні моделі

Lambda vs Kappa

Lambda: batch (DWH/ETL) + streaming (оператив). Плюс - гнучкість і «дешевий» беч; мінус - подвійна логіка.
Kappa: всі - як потік з журналу (Kafka). Плюс - єдиний код, реігра подій; мінус - суворіше вимоги до інфраструктури.

Практика: для критичних real-time контурів - Kappa; для звітності/ML-навчання - додатковий batch-контур.

Конвеєр подій (референс)

1. Виробники: сервіси ставок/платежів публікують доменні події (outbox → Kafka).
2. Шина: Kafka з партіями за ключами ('player _ id','bet _ id').
3. CDC: Debezium витягує зміни з OLTP (баланси, ліміти) в стрім.
4. Потокова обробка: Flink/ksqlDB/Spark - агрегації, вікна, CEP, join'и.
5. Проекції: матеріалізовані таблиці (Kafka Streams state store/ksqlDB tables/Redis), OLAP (ClickHouse/Druid).
6. Споживачі: антифрод, CRM, повідомлення, дашборди, тригерні воркфлоу.

Контракти даних і схеми

Avro/Protobuf + Schema Registry: суворі контракти, backward-compatible міграції.
Версіонування: `domain. event. v{n}`; забороняти ламаючі зміни.
PII: токенізація/шифрування, маскування, purpose limitation (GDPR).

Семантики доставки та ідемпотентність

At-least-once - де-факто стандарт (можливі дублікати) → обов'язковий idempotent-handling.
Exactly-once в стрімінгу: транзакційні продьюсери Kafka + EOS в Flink/Streams; дорожче, застосовуйте точково (гроші/баланс).
Outbox + CDC: єдине джерело правди з БД сервісу, захист від подвійного запису.
Dedup: ключ ('idempotency _ key'), таблиця дедуплікації з TTL, upsert/merge.

Тимчасові вікна та «пізні» дані

Вікна:
  • Tumbling - фіксовані слоти (наприклад, хвилина обороту).
  • Hopping - ковзаючі з кроком (наприклад, вікно 5 хв з кроком 1 хв).
  • Session - по неактивності (сесії гравця).
  • Watermarks: обробка по event-time, допуск «пізняків» (lateness), евакуація в DLQ/side-output.
  • CEP (Complex Event Processing): патерни «A потім B в 3 хв», «N подій за M секунд», «скасування/компенсація».

Стан і масштабування

Stateful оператори: агрегації/джойни тримають стан (RocksDB state backend).
Changelog topics: надійність і відновлення state.
Backpressure: авто-регулювання швидкості, ліміти на sink/外 системи.
Розподіл ключів: гарячі ключі (heavy hitters) → key-salting, skew mitigation.

Моніторинг та SLO

SLO потоку: p99 end-to-end latency (наприклад, ≤ 2 с), допустимий consumer lag, доступність ≥ 99. 9%.
Метрики: throughput, lag по партіях, watermark delay, drop/late ratio, backpressure, busy time операторів, GC/JVM.
Алерти: зростання DLQ, відставання watermark, провали EOS чекпоінтів, розсинх фічів онлайн/офлайн.
Трейсинг: кореляційні ID ('trace _ id','message _ id') крізь продьюсер-стрім-консьюмер.

Безпека та комплаєнс

TLS/MTLS, ACL/RBAC на топіки/таблиці, сегментація чутливих доменів (платежі/КУС).
Шифрування PII в транзиті/на диску; секрети в Vault/SOPS.
Data retention & locality: зберігання по регіонах (ЄС, Туреччина, ЛатАм), поліс видалення.
Аудит: хто публікував/читав, відтворюваність сценаріїв.

Висока доступність і DR

Kafka: `replication. factor ≥ 3`, `min. insync. replicas','acks = all', крос-регіональна реплікація (MM2) для DR.
Flink/Streams: періодичні checkpoint + savepoint для контрольованих релізів; HA-JobManager.
OLAP: реплікація сегментів, read replicas; тести failover (game day).

Продуктивність і тюнінг

Продьюсери: батчинг ('linger. ms`, `batch. size'), компресія (lz4/zstd).
Консьюмери: правильний'max. poll. interval', пауза партій при бекофі.
Партіонування: рахунок партій з цільового TPS і паралелізму.
State: RocksDB options (block cache/write buffer), NVMe/IOPS, pinning.
Network: 10/25G, TCP-тюнінг, стримування n + 1 sink-запитів.

Реалізація: ключові технології

Шина: Apache Kafka (альтернативи: Pulsar, Redpanda).
Потокова обробка: Apache Flink, Kafka Streams, ksqlDB, Spark Structured Streaming.
CDC: Debezium (MySQL/Postgres), Outbox-конектори.
Сховища проекцій: ksqlDB tables, Kafka Streams state store, Redis для низької латентності, ClickHouse/Druid/Pinot для OLAP.
Фічестор: Feast або власний - онлайн (Redis) + офлайн (Parquet/BigQuery), гарантія консистентності.

Патерни проектування

Outbox → Kafka: кожна доменна подія з транзакції БД.
Саги: компенсації через події; оркестрація - стрімом.
Fan-out: одна подія → антифрод, CRM, аналітика, нотифікації.
Materialized Views: лідерборди, баланс, ліміти - у вигляді таблиць, що оновлюються зі стріму.
Reprocessing: відтворення топіків для перерахунку агрегатів/ретро-аналітики.

Приклади (концепти)

ksqlDB: лідери турніру (ковзне вікно)

sql
CREATE STREAM bets_src (
bet_id VARCHAR KEY,
player_id VARCHAR,
amount DOUBLE,
ts BIGINT
) WITH (KAFKA_TOPIC='bets. placed. v1', VALUE_FORMAT='AVRO', TIMESTAMP='ts');

CREATE TABLE leaderboard AS
SELECT player_id,
SUM(amount) AS total_stake,
WINDOWSTART AS win_start,
WINDOWEND  AS win_end
FROM bets_src
WINDOW HOPPING (SIZE 10 MINUTES, ADVANCE BY 1 MINUTE)
GROUP BY player_id
EMIT CHANGES;

Flink (псевдокод): антифрод-скоринг c late-events

java stream
.assignTimestampsAndWatermarks(WatermarkStrategy. forBoundedOutOfOrderness(Duration. ofSeconds(10)))
.keyBy(e -> e. playerId)
.window(SlidingEventTimeWindows. of(Time. minutes(5), Time. minutes(1)))
.aggregate(scoreFunction, processWindow)
.sideOutputLateData(lateTag)
.addSink(riskTopic);

Тестування якості потоків

Contract-тести схем та еволюції (Schema Registry).
Навантажувальні: цільової TPS, p99, поведінка при деградації sink.
Failure/chaos: падіння брокерів/вузлів, мережеві затримки, split-brain.
Deterministic replays: повторний прогін топіків → однакові результати.
Canary-потоки: контур перевірки затримки і цілісності.

Чек-лист впровадження

1. Визначити SLO (p99 E2E ≤ X c, lag ≤ Y, доступність ≥ Z).
2. Стандартизувати схеми і ключі (player_id/bet_id).
3. Вибрати архітектуру (Kappa для критичних контурів).
4. Налаштувати outbox + CDC та ізолювати PII.
5. Задати вікна, watermark, late-policy і DLQ/side outputs.
6. Включити EOS/ідемпотентність на грошових шляхах.
7. Ввести моніторинг і алерти на lag, watermark, DLQ.
8. Забезпечити HA/DR і регламенти reprocessing.
9. Розгорнути Feature Store і синхронізацію онлайн/офлайн.
10. Провести game-day: відпрацювання відмов і відновлення.

Антипатерни

Змішування event-time і processing-time без усвідомленої політики.
Відсутність schema governance → «ламаючі» релізи.
Ігнорування late data і «гарячих ключів».
Відсутність replay-стратегії і версіонування топіків.
Ставки/платежі без idempotency і EOS.

Підсумки

Real-time стрімінг - це не «ще один транспорт», а спосіб мислення: доменні події, чіткі SLO, контракти даних, вікна і стан, безпека і спостережуваність. Для iGaming стійкий набір - Kafka + Flink/ksqlDB + Debezium + Materialized Views + Feature Store. Він дає мілісекундні реакції, узгодженість онлайн/офлайн аналітики і контрольовану складність при зростанні навантаження.

Contact

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

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

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

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

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

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