运营和管理→扩展运营基础架构
扩展运营基础架构
1)为何以及如何考虑"缩放"
扩展是平台的系统吞吐量(RPS/TPS,连接器,IOPS,throughput)和数据量而不会丢失SLO,并且成本可控。对于iGaming/fintech,它直接是关于金钱:存款/投注转换,现场游戏和结算。
目标是:- 将SLO保持在负载增长和季节性峰值的X倍。
- 提供可预测的缩放时间(minutes, not hours)。
- 保存经济:cost/RPS, cost/Transaction, cost/1k事件。
2)可扩展平台原则
1.水平第一:分为小型,无状态服务;状态-在数据群集中。
2.后压和队列:平滑浪潮,保护"风暴"。
3.所有层上的缓存:client/edge/service/DB。
4.相似性和可重复性:安全的背包,外包,背包。
5.限制成瘾:taymauts,breakers,bulkhead隔离,rate-limits。
6.电容信号的可观察性:头部,p95/p99,lag,接头,配额。
7.使用加尔达飞行进行自动缩放:HPA/VPA/Cluster Autoscaler+停止条件。
8.多区域设计:独立的爆炸区域,本地数据,可持续的捕获器。
3)能力规划: 如何"计算需要多少"
模型输入:目标峰值TPS,流量配置文件(每小时),"关键路径",快取命中率,平均付费量,SLO和提供商限制。
快速评估(规则规则):- RPS → CPU/pods:'pods=RPS p99_time/有效_CPU__pode'(库存为30-50%)。
- 队列:"最低_速度_领事≥峰值_速度_生产者1。2`.
- DB-connects: 'max_conns=active_pule_levels mid_pool_size 1。3`.
- 缓存:大小="N分钟内的热工作集"+20-30%的库存。
- Egress/CDN: egress峰值=查询峰值平均响应大小(考虑压缩)。
Headroom:高峰时目标20-40%(按层)。低于15% → "capacity uplift"触发器。
4)图层和缩放模式
4.1 Edge / CDN / WAF
边缘缓存(TTL+SWR)、地理平衡、压缩、HTTP/2/3。
IP/JWT/密钥外围的限位,爆发保护。
通过经纪人/频道pub/sub对事件进行粉丝(头奖,现场警报)。
4.2个API网关/前沿后端
横向缩放在statles-pods上,将池分解为downstream。
按业务指标划分的HPA:RPS,p99,在企业池中排队-而不仅仅是CPU。
4.3异步队列/流媒体(Kafka/Rabbit/Pulsar)
按党派和党派划分的规模;避免skew(钥匙和分配)。
Lag-alerta+控制器的自动缩放;DLQ和复古拓扑。
在SLA下进行重新调整和重新安排。
4.4个缓存(Redis/Memcached)
群集模式,复制品,事件策略(LFU),multiget,管道。
分离热键和后台任务、客户端限制和最大内存策略。
4.5个数据库
阅读副本和阅读漫游,连接池。
按区域/tenant/密钥范围行驶。
CQRS:写入向导/向导,读取到副本。
索引和击球写作workflow(outbox → stream → sink)。
存档和热/冷数据(tiering)。
4.6个文件/对象存储
多线程,多路加载,CDN前端,异步转换。
提供商配额,"尾巴"清洁和预算。
4.7个提供商(PSP/KYC/工作室)
按配额/SLO/成本进行多供应商和路由。
每个提供商的circuit breaker+rate-limit,转发队列,"grace模式"。
5)自动缩放和警员飞行
Kubernetes:
HPA: метрики `rps_per_pod`, `queue_depth`, `p99_latency`; `targetAverageValue`.
VPA:资源建议;非高峰更新。
Cluster Autoscaler:具有优先级的nod组配置文件(点对点)。
PodDisruptionBudget/TopologySpreadConstraints:区域均匀性。
LimitRange/ResourceQuota:防止"醉酒"的破坏。
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler spec:
scaleTargetRef: {apiVersion: apps/v1, kind: Deployment, name: api-gw}
minReplicas: 8 maxReplicas: 200 metrics:
- type: Pods pods:
metric:
name: rps_per_pod target:
type: AverageValue averageValue: "120"
- type: Pods pods:
metric:
name: p99_latency_ms target:
type: AverageValue averageValue: "280"
behavior:
scaleUp:
stabilizationWindowSeconds: 90 scaleDown:
stabilizationWindowSeconds: 300
Guardrails(示例):
- "Pause&Rollback",如果使用p99> 1金丝雀。3 ×基线10分钟。
- 黄金时段的"Freeze scale-down",只是scale-up。
- "Stop retries"在"open_circuit=1"到瓶颈处。
6)多区域: 资产/资产和资产/passive
爆炸性孤立区域:独立集群,本地秘密/配额。
全球漫游:基于latency -/geo,health-probes,手动超速。
- 热-本地+事件复制(流)。
- 关键事务-按域约定(ledger/balances)。
- Failover-playbooks:回合制来源变化,TTL,缓存加热。
- 运动规则(DR):具有RTO/RPO目标的季度锻炼。
7)网络和服务模式
Service Mesh: mTLS, retry/breaker, outlier检测,per downstream限制。
eBPF/Observability L4/L7,连接限制,线头保护。
用于S2S的内部API网关,通用限额和审核。
跨爆炸区域的VPC/子网,NAT/Egress控制,与供应商同行。
8)性能: 测试和证明
Load&stress进入黄金时段配置文件+worst-case。
Soak(冗长)-内存/描述符泄漏,后坐力增长。
混乱/游戏日:经纪人/提供者/区域的下降,"缓慢提供者"。
CI 中的Perf回归:一组参考脚本和自动门。
9)数据和存储: 增长战略
垂直生长至"天花板"→水平/缓和。
读取→副本/缓存;→ batchi/asinchron/日志记录。
图形迁移:expand → migrate → contract,没有全局锁定。
归档:冷批量进入廉价存储+按需再加氢。
搜索:带有增量更新分页的单独索引(OpenSearch/Solr)。
10)供应商和配额管理
配额卡(TPS,窗口,成本);alerta'usage_ratio> 0.9`.
按成本/质量进行漫游(智能漫游)。
OLA ↔ SLO协议和提高配额的过程。
备用池和热切换。
11)可观察性和缩放信号
度量(最低):- Capacity headroom по слоям; `queue_lag/backlog growth`; `kafka ISR`; `db connections`/`repl lag`; `redis evictions`; `open_circuit`/`retry_rate`; `quota_usage`.
- 业务指标:成功率/存款转换,游戏启动时间。
- 费用:费用/RPS,费用/1k电话。
- Capacity Overview(头部,最高风险,burn-rate SLO)。
- Stream & Queue Panel (lag/backlog, consumer saturation).
- DB&Cache(p99,connects,hit/evictions)。
- Providers&Quotas(TPS,timeouts,成本,开关)。
- Change Safety(发布前/发布后,金丝雀,赛车)。
ALERT HeadroomLowAPI
IF capacity_headroom{layer="api"} < 0. 15 FOR 10m
ALERT KafkaBacklogAtRisk
IF (consumer_lag > 5e6 AND rate(consumer_lag[5m]) > 5e4) AND (hpa_desired == hpa_max) FOR 10m
ALERT DBConnectionsNearMax
IF active_conns / max_conns > 0. 85 FOR 5m
ALERT ProviderQuota90
IF usage_quota_ratio > 0. 9 FOR 5m
12) FinOps: 以有利可图的方式扩展
效率系数:费用/RPS,费用/存款,费用/1k事件。
Right-sizing: VPA/建议, "over-provisioned"报告。
Spot/Preemptible用于非关键内容;保留/委托用于基本负载。
Egress预算和缓存,CDN/edge-ofload。
按价值级别(hot vs cold)收集和存档日志。
警告配额(软帽)和扩展自动滴答声。
13)流程和人员
改变管理:金丝雀、ficheflagi、回归停止。
事件准备:运行手册和"在哪里添加容量","如何切换区域"。
高峰计划:比赛/锦标赛/活动日历和提供商窗口。
定期比赛日和DR演习。
所有权矩阵:谁可以"按住按钮"到收件人/增加配额。
14)实施支票
启动基本可扩展性(2-4周):- 关键路径和极限图(按层),头部目标≥ 30%。
- HPA业务指标+集群自动驾驶仪;PDB/SpreadConstraints.
- 热线队列,idempotency-keys, outbox。
- Cashi:热门目标≥ 90%, evictions policy,关键指数。
- DB:读取副本,连接池,缓存计划。
- 提供商:多供应商、配额、断路器/中继器。
- Dashbords "Capacity/Stream/DB/Providers",来自§11。
- 金丝雀和赛车"发布前/发布后"。
- DR-playbook和一部分feilover培训。
- 加热缓存,HPA/ASG前面,战备备用副本。
- 提高供应商配额,包括智能路由。
- 为非临界变量启用夜间抑制模式。
- Ficheflag的"安全模式"已准备好立即打开。
15)反模式
垂直升级"直到站立"而不是水平升级。
所有下游(线头)上的共享流/连接池。
在瓶颈的时空上回荡,缺乏抖动→风暴。
Alert和Scale Politics中没有滞后→"锯"。
单个全局DB,无需数据缓存和本地化。
对供应商的SDK的盲目信念,而无需控制taymout/retrais/可观察性。
缺乏DR演习:failover"仅在纸上"。
16) KPI可扩展性
SLO合规达到顶峰(p95/p99,成功率)。
在黄金时段按层排列。
MTTS(量表时间)-在出现其他资源之前。
Backlog/Lag Resolution Time-高峰后排队的时间。
在积极增长的时期改变失败率。
Cost/RPS 和缓存/CDN/edge-ofload的节省。
DR准备:练习中的RTO/RPO。
17)"快速"模式示例
Kafka:Concumers的分期付款和自动面包(想法):
partitions(topic="bets") = ceil(peak_msgs_per_sec / target_msgs_per_partition)
consumers = min(partitions, max_pods); rebalance_on: skew > 1. 5x scale_up_if: lag > 5e5 && rate(lag[5m]) > 5e4
PostgreSQL:
max_connections = poolers pool_size 1. 3 read_routing: primary (write), replicas (read majority)
shard_key: tenant_id or region_id
Redis:
maxmemory-policy: allkeys-lfu cluster-replicas: 1 evict-alert: rate(evictions[5m]) > 0 && used_mem/limit > 0. 8
金丝雀赛车场政策(conspect):
guardrails:
- metric: api_p99_ms, threshold: 1. 3 baseline_1d, window: 10m, action: pause_and_rollback
- metric: error_rate, threshold: 2 baseline_1d, window: 5m, action: pause max_step: 10%
step_interval: 15m
18) FAQ
Q: 首先扩展什么?
答:根据行车记录的瓶颈:队列/缓存/DB读取。热路(存款/投注/游戏启动)-优先。
问:如何理解自动缩放"使情况变得更糟"?
A:查看相关性:scale-up↑,p99/错误没有改善-也许你正在"扩展问题"(狭窄的下流/配额)。打开断路器/降级。
Q: 总需要第二个供应商吗?
答:对于关键路径,是的。否则,至少使用简化脚本和缓存的"安全模式"。
Q: Active-active или active-passive?
答:如果RTO的要求很低,很多区域参与者都是主动的。否则,首先使用已用完的feilover进行主动传递。