GH GambleHub

Интерфейсы доступа к данным

1) Зачем продуманный интерфейс

Скорость и предсказуемость: бизнес-метрики и отчеты укладываются в SLA, без «ручных выгрузок».
Безопасность и приватность: PII/биометрия под контролем, k-анонимность, гео-границы.
Гибкость: разные клиенты (BI, сервисы, партнеры, DS/ML) получают ровно то, что им нужно.
Повторное использование: «данные как продукт» с контрактами и версиями.

2) Карта интерфейсов (когда что)

SQL/ANSI + вендорные диалекты: интерактивная аналитика, BI, ad-hoc.
REST JSON: стабильные агрегаты и операционные данные, интеграции с партнерами.
GraphQL: гибкое «выборочное» чтение и граф навигации (измерения/факты).
gRPC (protobuf): низкая латентность online-сервинга (Feature Store, скоринг).
Arrow Flight / Parquet over HTTP/S3-presigned: быстрые столбцовые «дампы» для DS/ML.
OData: enterprise-инструменты, модель «таблица как сервис».
Streams (Kafka/Pulsar) + CDC/Webhooks: события в реальном времени, реактивные интеграции.
Federation (Trino/Presto): единая точка входа к множеству источников.

Правило: агрегаты и стабильные срезы → REST/MV, богатые произвольные запросы → SQL, низкая латентность/онлайн-фичи → gRPC, гибкая форма ответа → GraphQL, массовый двоичный обмен → Arrow/Parquet.

3) Контракты и версии (semver)

`MAJOR.MINOR.PATCH` для каждого API/схемы/события.
MAJOR: несовместимые изменения (новый путь/топик/таблица).
MINOR: совместимые добавления полей/аргументов.
PATCH: правки описаний/лимитов.
Контракты фиксируют: схему, фильтры, лимиты, приватность, SLO.

OpenAPI (фрагмент, REST-метрики):
yaml openapi: "3. 0. 3"
info: {title: "Analytics API", version: "2. 4. 0"}
paths:
/v2/payments/metrics:
get:
parameters:
- {name: brand, in: query, schema: {type: string}, required: true}
- {name: country, in: query, schema: {type: string}}
- {name: from, in: query, schema: {type: string, format: date-time}}
- {name: to, in: query, schema: {type: string, format: date-time}}
- {name: group_by, in: query, schema: {type: string, enum: [psp,status,day]}}
- {name: limit, in: query, schema: {type: integer, default: 500}}
responses:
"200": {description: "OK"}
x-slo: {p95_latency_ms: 1200, freshness_max: "PT5M"}
x-privacy: {pii: false, min_group_size: 20}

4) Доступ к аналитике (SQL и федерация)

SQL-шлюз с ролями/масками (row/column-level security).
Вьюхи/проекции под BI: стабильные имена и семантика; heavy-запросы уходят на предагрегации.
Federation (Trino/Presto): единая точка входа, но с политиками: какие каталоги и какие функции доступны.
Lakehouse (Iceberg/Delta/Hudi): time-travel, snapshot-извлечения через SQL/REST.
Квоты: scanned bytes/query, concurrency, wall-time.

5) GraphQL (гибкая форма)

Даем клиенту собрать нужное поле, но исполняем поверх подготовленных вьюх/проекций, с лимитами глубины/костей.

graphql type Query {
payments(
brand: String!, country: String, from: DateTime!, to: DateTime!,
first: Int = 200, after: String
): PaymentConnection
}

Политики: depth ≤ 5, total nodes ≤ 5k, запрещаем произвольные regex/like по строкам; кешируем частые запросы.

6) gRPC / Feature Store (низкая латентность)

Онлайн-фичи для скоринга антифрода/рекомендаций/RG.

proto service FeatureStore {
rpc GetFeatures (FeatureRequest) returns (FeatureResponse);
}
message FeatureRequest { string user_tok = 1; repeated string features = 2; }
message FeatureResponse { map<string, FeatureValue> values = 1; int64 ts_micros = 2; }

Требования: p95 ≤ 50–100 мс, точная согласованность оффлайн↔онлайн, TTL фич, кэш LRU, idempotency и mTLS.

7) Потоки и CDC

События домена: `payments.deposit_accepted`, `game.round_finished`.
CDC (из OLTP): изменения статусов/лимитов в near-real-time.
Webhooks для партнеров: подписка на агрегаты (например, «отказы PSP>порог»).
Политики ретраев/подтверждений: exactly-once для критичных, at-least-once для мониторинга.

8) Озера и крупные выборки

Arrow Flight для быстрых колонночных выгрузок в DS/ML.
Presigned-URL на Parquet/Feather, с коротким TTL и подписанным запросом.
Chunked transfer и контроль размера файла; журнал скачиваний (WORM-аудит).

9) Фильтры, пагинация, сортировки

Keyset-пагинация (курсор) вместо OFFSET для больших наборов.
Фильтры: whitelists по полям, типам и операторам (`=, IN, BETWEEN, prefix`).
Сортировка: ограниченный список полей, default порядок.
Partial response: `fields=brand,country,amount` уменьшает полезную нагрузку.

http
GET /v2/game-rounds? brand=X&from=...&to=...&first=1000&after=eyJkYXRlIjoi...

10) Кэширование и стоимость

Result cache для шаблонных запросов, инвалидируем по токену свежести (snapshot id).
Edge-кэш/CDN для публичных/полупубличных агрегатов (без PII).
Budget-параметры: лимит scanned bytes, таймаут запроса, квоты rps/мин.
Приоритизация пулов: `bi_hot`, `adhoc`, `partner_api`.

11) Безопасность и приватность

AuthN: OAuth2/OIDC (client credentials для сервисов, PKCE для людей).
AuthZ: RBAC + ABAC (атрибуты: бренд, страна, лицензия, роль).
mTLS между сервисами, TLS 1.2+ наружу.
PII-гигиена: маски/токенизация на API-слое, колоночные маски, k-анонимность агрегатов.
Geo/tenant-изоляция: маршрутизация запросов в регион лицензии; ключи шифрования на бренд/регион.
DSAR/Legal Hold: поиск по токену субъекта, секреты для заморозки наборов.

12) Наблюдаемость (SLI/SLO) и защита

SLI: p50/p95/p99 lat, error-rate, rps, bytes scanned, cache hit, квоты/лимиты, доля маскированных колонок, доля отказов по авторизации.
SLO: p95 латентности, свежесть данных, % успешных запросов, min-group-size на ответах.
Алерты: рост scanned bytes, падение hit-rate, всплеск 429/5xx, попытки доступа к PII, утечки курсоров.

Пример политики:
yaml slo:
p95_latency_ms: 1200 success_rate: 0. 995 freshness_max: "PT5M"
privacy:
pii_allowed: false min_group_size: 20 quotas:
rps: 50 max_scanned_mb: 256

13) Форматы и компрессия

JSON для совместимости; CSV — только для небольших и несложных экспортов.
Parquet/Arrow — по умолчанию для больших выгрузок.
Compression: gzip/zstd (переговоры через `Accept-Encoding`).
Content-negotiation: `Accept: application/x-parquet`.

14) Метрики как API (Analytics/OLAP-шлюз)

Метрики верхнего уровня: GGR/NET, CR, удержание, RG-инциденты — как ресурсы с параметрами `brand,country,window,group_by`.
Approx (HLL/TDigest) для distinct/percentiles.
Кэш с ключом: `(metric, params, snapshot_id)`.

15) Специфика iGaming — готовые эндпоинты

`GET /v2/payments/metrics` — отказы/апрувы по PSP/стране/бренду с 7/30d окнами.
`GET /v2/game-rounds/metrics` — топ-игры/провайдеры, p95 длительности, RTP-окна.
`GET /v2/rg/cases` — активные ограничения/самоисключения (k-анонимные агрегаты).
`POST /v1/features:get` (gRPC) — онлайн-фичи для скоринга фрода/рекоммендера.
`POST /v1/webhooks/psp-alerts` — уведомления «decline rate > порога».

16) Примеры контрактов

GraphQL запрос тонкий срез:
graphql query {
payments(brand:"X", country:"TR", from:"2025-10-01", to:"2025-10-31", first:500) {
edges { node { day totalAmount declines psp } cursor }
pageInfo { hasNextPage endCursor }
}
}
Kafka (событие, Avro):
json
{"event_id":"...","occurred_at":169..., "brand":"X","psp":"Papara","status":"declined","amount":"100. 00","currency":"TRY"}
Arrow Flight (ручка):

/flight/v1/query? dataset=gold. payments&from=...&to=...&brand=X&format=arrow

17) Процесс публикации нового интерфейса

1. ADR: проблема/ценность/клиенты/безопасность/стоимость.
2. Контракт: схема, фильтры, лимиты, приватность, SLO, версии.
3. Нагрузочное моделирование: top-N запросов, p95/скан-байты, стоимость.
4. Валидация/кеш/квоты: включить по умолчанию.
5. Документация и SDK: примеры, лимиты, ошибки, ретраи, идемпотентность.
6. Canary: % клиентов, регресс-тесты, алерты.
7. GA: версия в каталоге Data Products, отчет по эффектам.

18) Анти-паттерны

Открыть «сырой» SQL всем — утечки PII, непредсказуемая стоимость.
OFFSET-пагинация и `SELECT ` — боль по латентности и счету.
GraphQL без ограничений глубины/стоимости.
REST, который возвращает слишком много колонок без `fields=...`.
Отсутствие k-анонимности и min-group-size в агрегатах.
Нулевые квоты/лимиты и отключенный кэш.
Нет версионирования/контрактов — «ломаем» клиентов при каждом изменении.
Один и тот же интерфейс для всех стран/брендов — игнор региональных правил.

19) Дорожная карта внедрения

0–30 дней (MVP)

1. Каталог Data Products (метрики/срезы) и их OpenAPI/GraphQL контракты.
2. SQL-шлюз с RLS/CLS, k-анонимность агрегатов, базовые квоты.
3. Один REST-метрик эндпоинт (`/payments/metrics`) + кэш + пулы `bi_hot/adhoc`.
4. gRPC Feature Store: чтение 10–20 ключевых онлайн-фич (p95 ≤ 80 мс).

30–90 дней

1. Стрим-интерфейсы (Kafka/Webhook) для PSP-алертов/игровых событий.
2. Arrow/Parquet выгрузки с presigned-URL; каталог снапшотов.
3. Federation-шлюз (Trino/Presto) с явными политиками.
4. Наблюдаемость: дашборд SLI/SLO, алерты на стоимость/латентность/PII.

3–6 месяцев

1. SDK (TypeScript/Python/Go) с ретраями/идемпотентностью/квотами.
2. Тонкие GraphQL-срезы для продуктов и партнеров.
3. Расширение gRPC/FS, согласование оффлайн↔онлайн; shadow→canary релизы.
4. Аудит приватности/DSAR; отчеты комплаенса по доступам.

20) RACI

Data Platform (R): шлюзы, кэш, квоты, федерация, наблюдаемость.
Data Governance (A/R): контракты, версии, приватность/k-анонимность.
Domain Owners (R): семантика полей, бизнес-инварианты, Data Products.
Security/DPO (A/R): AuthN/Z, geo-изоляция, DSAR/Legal Hold.
SRE/Observability (C): SLO/SLI, алерты, capacity.
Analytics/BI/DS (C): требования к формам/агрегатам, SDK.

21) Связанные разделы

Индексация аналитических хранилищ, Оптимизация аналитических запросов, Схемы данных и их эволюция, Валидация данных, DataOps-практики, API аналитики и метрик, Feature Store, Безопасность данных и шифрование, Контроль доступа, Политики хранения данных.

Итог

Правильно спроектированные интерфейсы доступа к данным превращают хранилища и потоки в надежный «продукт»: предсказуемые SLA, контролируемая стоимость, соблюдение приватности и единый язык для команд продукта, аналитики, комплаенса и партнеров. В iGaming это значит быстрее ловить сбои PSP, понимать поведение игроков и выполнять требования регуляторов — без ручных выгрузок и ночных миграций.

Contact

Свяжитесь с нами

Обращайтесь по любым вопросам или за поддержкой.Мы всегда готовы помочь!

Telegram
@Gamble_GC
Начать интеграцию

Email — обязателен. Telegram или WhatsApp — по желанию.

Ваше имя необязательно
Email необязательно
Тема необязательно
Сообщение необязательно
Telegram необязательно
@
Если укажете Telegram — мы ответим и там, в дополнение к Email.
WhatsApp необязательно
Формат: +код страны и номер (например, +380XXXXXXXXX).

Нажимая кнопку, вы соглашаетесь на обработку данных.