# 扩展

FluxiQ PIX 的水平和垂直扩展策略，以满足 TPS 目标。

## 前提条件

- 了解当前负载模式
- 访问 Kubernetes 集群或基础设施管理
- 已配置监控以测量基准性能

## TPS 目标

| 目标 | 值 | Pod 数 | 每 Repo 连接池 |
|------|-----|--------|---------------|
| 开发 | ~100 TPS | 1 | 10 |
| 预发布 | ~500 TPS | 2 | 50 |
| 生产 | 5,000 TPS | 4-8 | 200 |
| 突发 | 7,500 TPS | 8-12 | 250 |

## 水平扩展

### 后端 Pod

```bash
# 手动扩展
kubectl scale deployment pix-backend -n pix --replicas=4

# 水平 Pod 自动扩展器
kubectl autoscale deployment pix-backend -n pix \
  --min=2 --max=8 --cpu-percent=70
```

每个 Pod 运行全部 4 个 Elixir 应用（shared、dict、spi、settlement）。NATS Worker 通过消费者组自动分配负载。

### 连接池影响

扩展 Pod 时，确保数据库能处理总连接数：

```
总连接数 = POOL_SIZE x 4 repos x Pod 数
```

| Pod 数 | POOL_SIZE | 总连接数 | 所需 max_connections |
|--------|-----------|----------|---------------------|
| 2 | 200 | 1,600 | 1,800+ |
| 4 | 200 | 3,200 | 3,500+ |
| 8 | 200 | 6,400 | 7,000+ |

## 垂直扩展

### Kubernetes 资源

```yaml
resources:
  requests:
    cpu: "2"
    memory: 2Gi
  limits:
    cpu: "4"
    memory: 4Gi
```

更高 TPS 时增加限制：

```yaml
resources:
  requests:
    cpu: "4"
    memory: 4Gi
  limits:
    cpu: "8"
    memory: 8Gi
```

### BEAM VM 调优

Erlang VM 受益于调度器配置：

```bash
# 在 release 环境中设置
export ERL_FLAGS="+S 8:8 +sbwt very_long +swt very_low"
```

## NATS Worker 扩展

Worker 随 Pod 自动扩展。每个 Worker 的调优参数：

| 参数 | 低负载 | 高负载 |
|------|--------|--------|
| `batch_size` | 50 | 100 |
| `poll_interval` | 500ms | 200ms |
| `max_concurrency` | 5 | 10 |

自适应背压自动调整 `poll_interval`：
- 满批（100 条消息）：最小间隔（50ms）
- 空批（0 条消息）：最大间隔（2000ms）
- 部分批：配置间隔

## 数据库扩展

### 只读副本

对于读取密集型工作负载，添加 PostgreSQL 只读副本：

```elixir
# config/runtime.exs
config :shared, Shared.Repo.Replica,
  hostname: System.get_env("DB_REPLICA_HOST"),
  pool_size: 100
```

### 连接池（PgBouncer）

对于超高连接数，添加 PgBouncer：

```ini
[databases]
monetarie = host=10.140.241.2 port=5432 dbname=monetarie

[pgbouncer]
pool_mode = transaction
max_client_conn = 10000
default_pool_size = 200
```

### 表分区

对于超过 1 亿行的表，考虑按日期对 `monetarie_spi.messages` 进行分区：

```sql
-- 未来迁移
ALTER TABLE monetarie_spi.messages
  PARTITION BY RANGE (inserted_at);
```

## Redis 扩展

Redis 处理速率限制、黑名单和幂等性。高 TPS 配置：

| 配置 | 值 |
|------|-----|
| `maxmemory` | 4-8 GB |
| `maxmemory-policy` | `allkeys-lru` |
| 集群模式 | > 10K TPS 时启用 |

## 负载测试

```bash
# K6 负载测试 — 5K TPS 持续
k6 run --vus 500 --duration 5m k6/load-5k-tps.js

# K6 Phase 12 验证
k6 run k6/phase12-validation.js
```

## 预期结果

实施扩展后：

- 后端 Pod 根据 CPU 利用率在 2 到 8 之间自动扩展
- 数据库连接池根据 Pod 数量合理配置
- NATS Worker 跨 Pod 分配负载
- 自适应背压在负载下维持吞吐量
- 4+ Pod 时可持续 5,000 TPS
