统计和分析API:事件,聚合,重组
文章全文
1)为什么外部API分析
合作伙伴/提供商:监视SLA内容、RTP、参与。
营销/CRM:基于指标的触发活动(DAU,存款漏斗)。
运营/财务:近实时GGR/NGR、支付成功、webhook泻湖。
产品:应用内统计小部件,A/B面板。
目标是安全和可预测地以清晰的语义和SLA提供事件和集合。
2)手指上的建筑
Producers (PAM/Wallet/RGS/Payments/Kafka/CDC)
│
Ingestion API ──Stream (Kafka/Pulsar) ──Lakehouse (Delta/Iceberg)
│                 └─OLAP (ClickHouse/BigQuery/Trino)
└────────────────────────────────────Aggregation/Query API
(cache, RBAC/RLS, rate limits)事件:on-least-once,"event_id/idempotency_key"的去世。
聚合物:赛前滚动(1m/5m/1h/1d)+上飞。
Retenchen:在Gold Marts之上的cohort引擎。
Кэш: CDN/edge + ETag/`Cache-Control`, server-side TTL.
3)事件模型: 最低标准
3.1常见字段
json
{
"event_id":"uuid",  "event_type":"bet.settled",  "occurred_at":"2025-10-23T16:21:05Z",  "ingested_at":"2025-10-23T16:21:06Z",  "tenant_id":"brand-7",  "region":"EU",  "player_id":"p_19f3",   // псевдо-ID
"trace_id":"tr_a1b2c3",  "schema_version":"1.3.0",  "payload":{...}
}规则:UTC timestamps,"player_id"是别名,货币在小单位中。
3.2个关键类型
4) Ingestion API(适用于第三方来源)
发送事件包
POST /v1/events:batch
Headers: X-Idempotency-Key: ev_20251023_001
[
{"event_id":"...","event_type":"bet.placed",...},  {"event_id":"...","event_type":"bet.settled",...}
]
→ 202 { "accepted":2, "duplicates":0, "trace_id":"tr_a1b2" }保障措施:在保障之下;通过"event_id"在Silver中过滤重复。
5) Aggregation API: 时间系列和切片
5.1时间表(时间度量)
GET /v1/analytics/timeseries
?metric=ggr    // ggr, ngr, dau, deposits_success, rtp
&granularity=5m  // 1m/5m/1h/1d
&from=2025-10-22T00:00:00Z&to=2025-10-23T00:00:00Z
&filters=region:EU,brand_id:brand-7,provider_id:studio_x
&group_by=brand_id
→ 200 {
"metric":"ggr",  "granularity":"5m",  "series":[
{"ts":"2025-10-22T00:00:00Z","brand_id":"brand-7","value_minor":120030},   {"ts":"2025-10-22T00:05:00Z","brand_id":"brand-7","value_minor":98020}
],  "next_cursor":null
}5.2切片/上衣(按组)
GET /v1/analytics/slice
?metric=rtp &dim=game_id &from=2025-10-22&to=2025-10-23
&limit=50&order=-value
→ 200 { "items":[{"game_id":"g_01","value":0.956},...] }5.3漏斗(funnel)
POST /v1/analytics/funnel
{
"steps":[
{"event":"payment.intent"},   {"event":"payment.authorized"},   {"event":"payment.captured"},   {"event":"wallet.credit", "reason":"deposit"}
],  "window_sec": 3600,  "filters":{"region":"EU","brand_id":"brand-7"}
}
→ 200 {
"total": 12450,  "steps": [
{"name":"intent", "count":12450, "rate":1.0},   {"name":"authorized", "count":11020, "rate":0.885},   {"name":"captured", "count":10110, "rate":0.811},   {"name":"credited", "count":10050, "rate":0.807}
]
}5.4限制和缓存
Rate limit per token/brand/region.
"ETag"的回应;支持"If-None-Match"。
TTL缓存取决于"granularity"(例如5m → TTL 60-120 s)。
6)重生和队列: 规则和API
6.1定义(公约)
DAU/WAU/MAU:如果是'bet,则处于活动状态。placed'或'wallet。credit (deposit)` или `session.started '≥ N分钟。
Cohort by first deposit(通常用于LTV)或registration(用于参与)。
Retention D1/D7/D30:队列中的份额又回到了白天窗口+/-品牌超时区的入场券。
根据窗口中唯一的"player_id"来重新访问。
6.2个API队列
POST /v1/analytics/retention
{
"cohort":"first_deposit",  "start_date":"2025-09-01",  "end_date":"2025-09-30",  "return_event":"bet.placed",  "days":[1,7,14,30],  "filters":{"region":"EU","brand_id":"brand-7"}
}
→ 200 {
"cohort":"first_deposit",  "rows":[
{"cohort_date":"2025-09-01","size":1820,"d1":0.36,"d7":0.22,"d14":0.18,"d30":0.12},   {"cohort_date":"2025-09-02","size":1714,"d1":0.35,"d7":0.23,"d14":0.19,"d30":0.13}
]
}6.3 LTV/累积量
GET /v1/analytics/ltv?cohort=first_deposit¤cy=EUR&horizon=90d
→ 200 { "cohorts":[{"date":"2025-09-01","ltv_minor":[0,150,230,280,...]}] }7)语义指标(不争论)
所有内容均在UTC中,指定货币和次要单位;通过将固定的FX转换为Data Lake来解决多元货币性。
8)验证、过滤和兼容性
路径:'/v1/……';新度量/字段-选择性。
Фильтры: `brand_id, region, provider_id, game_id, method, currency, device, geo`.
分离:基于cursor("next_cursor")。
Breaking只→ '/v2'+Deprecation/Sunset头条新闻和changelog。
9)安全和准入
OAuth2 Client Credentials(短寿命令牌),用于B2B的mTLS。
RBAC/ABAC:度量/切片权限;通过"品牌/地区"的RLS过滤器。
PII:API不提供PII,仅在需要时提供聚合/伪ID。
驻地:将请求路由到区域;跨区域数据-禁止。
利率极限和配额,反赤字;WORM可用性审核。
10)SLO和可观察性
SLO地标:- 'GET/timeseries gran=5 m'p95 ≤ 500-800毫秒,'GET/slice' p95 ≤ 1-2 s(最高可达50-100个位置),'POST/retention'(队列月份)p95 ≤ 3-5 s,rollup的新鲜度:p95 ≤ 2-5分钟来自'occurred_at'。
- 度量标准:latency p50/p95/p99,error-rate(4xx/5xx),cache-hit,查询/扫描字节(OLAP),每个滚动的"freshness lag"。
- Logs:结构化的'trace_id'、查询过滤器(没有PII),扫描计数。
11)现金,初步计算,成本
滚动表:1m/5m/1h/1d按关键指标→快速"时间序列"。
重型切片/cohort的材料化视图。
ETag + max-age;后期事件中的残疾是增量发生的。
"热/冷"策略:在OLAP-warehouse中进行热门查询;档桉在湖里。
对查询的"扫描字节"限制;给调度员的提示。
12)嵌入(嵌入)和导出
通过带有RLS令牌的签名URL/iFrame内置小部件。
按任务(job API)导出CSV/Parquet(具有大小限制和时间参考)。
Webhook上载就绪通知。
13)支票单
体系结构
- 单一事件图,semver, registry;"event_id"的祖先。
- Rollup's和materialized views为顶级桉例。
- RLS/RBAC/ABAC,居住权,令牌寿命短。
- Cash (ETag/TTL), rate limits,配额。
语义学
- GGR/NGR/RTP/DAU/retention定义已记录在案。
- 货币-小单位;FX是在事件发生时捕获的。
- UTC Retention,考虑到显示中的品牌时间段。
业务活动
- SLO/dashbords新鲜和潜伏。
- WORM可用性/出口审核。
- DR/xaoc演习:积压的滚动,一连串的查询,迟到的事件。
14)反模式(红旗)
"原始"OLTP表直接放入API中。
命令之间的度量定义不一致。
没有重复数据消除和水厂→双/丢失事件。
没有缓存/配额的无限制飞行聚合→昂贵且缓慢的请求。
没有居住策略的跨区域聚合。
将PII/玩家的详细信息返回到公共响应中。
没有"/v2"和Deprecation的安静突破变化。
15)Mini-Spec(TL;DR)
事件:'/v1/事件:batch'(在least-once上,在'event_id'上删除)。
时间: '/v1/analytics/timeseries?metric=...&granularity=...` (rollup + кэш).
切片: '/v1/analytics/slice?metric=...&dim=...`.
漏斗:'/v1/analytics/funnel'(窗口、步骤、过滤器)。
再生/再生:'/v1/analytics/retion'(+LTV)。
安全性:OAuth2+mTLS,RLS,按品牌/区域代币,WORM审核。
SLO: p95 ≤ 0.5-2 c;新鲜度≤ 2-5分钟。
统计和分析的API不是"SELECT FROM big_table",而是合同度量:稳定事件,预读和可缓存单元,严格定义的重构和队列,安全性(RLS/RBAC)和居住性,SLO可以理解。因此,您可以快速、廉价和可预测地将数据提供给合作伙伴,产品和BI,而无需有争议的解释,并且不会泄漏或存储过载的风险。
