# AliCloud Serverless 实施任务清单 V2

## 范围与约束

- 仅支持 `AliCloud + Shared(Serverless/Starter/Essential)` SQL 主链路。
- regional 保留访问 account service。
- regional 去掉 DDB。
- regional 去掉 Redis。
- 不新增 dataservice 接口。
- 不新增 account service 接口。
- 不修改 proto。

## 0. 前置决策

- [ ] 确认 `DeployType` 足以区分 AliCloud `Shared(Serverless/Starter/Essential)`。
- [ ] 确认 regional URL 的 host 需要带 `{provider}`，path 仍保持 `/inner/dataservice/*`。
- [ ] 确认 AliCloud regional executor 第一版固定单实例。
- [ ] 确认 `GetClusterStatus` 不纳入 V2。
- [ ] 确认 `AliCloud + Serverless` regional 不部署 `dataapi_control`。

## 1. 配置与运行时选择

- [ ] 在配置中增加 AliCloud provider 标识。
- [ ] 在配置中增加 static route 列表：
  - `project_id`
  - `cluster_id`
  - `region`
  - `cloud`
  - `host`
  - `port`
  - `use_tls`
- [ ] 增加启动期 runtime/profile 选择逻辑：
  - AWS 继续旧模式
  - AliCloud 走新模式

验收：

- [ ] 缺少 static route 时启动或建连 fail fast。
- [ ] AWS 现有配置完全兼容。

## 2. Regional Executor

- [ ] 抽象 user meta provider。
- [ ] 保留 DDB provider 供 AWS 使用。
- [ ] 新增 static route provider 供 AliCloud 使用。
- [ ] executor 在 AliCloud 模式下不初始化 DDB。
- [ ] 保留现有 `fillUserAccount -> JwtClient -> account ACL` 链路。
- [ ] 不新增任何新的凭据 RPC 或 HTTP 接口。
- [ ] 在 `commons/sessioncache` 启用本地内存 driver。
- [ ] executor 在 AliCloud 模式下不初始化 Redis。
- [ ] local session 复用现有 TTL 和 `ErrInvalidSession` 语义。

验收：

- [ ] `CreateSession / ExecSql / CloseSession / GetDatabaseMeta` 可在无 DDB/Redis 下运行。
- [ ] executor 重启后旧 session 返回 `ErrInvalidSession`。
- [ ] session TTL 到期后返回 `ErrInvalidSession`。

## 3. Regional Gateway

- [ ] 新增单实例 dispatch strategy。
- [ ] AliCloud 下 `CreateSession` 直接走默认 executor client。
- [ ] AliCloud 下 `ExecSql / CloseSession` 不再依赖 Redis session lookup。
- [ ] AliCloud 下不再使用 `WithEndpointAddr(...)`。
- [ ] AliCloud 下 `WithLoadBalance(...)` 恒为 `false` 或等价 no-op。
- [ ] gateway 在 AliCloud 模式下不初始化 Redis。
- [ ] AliCloud 下不启动 `StartUnauthMetricsLoop()`。

验收：

- [ ] AliCloud gateway 启动时无 Redis 依赖。
- [ ] internal `/inner/dataservice/*` SQL 主链路可用。

## 4. Global 调用链

- [ ] 新增 provider-aware strategy selector。
- [ ] `AWS + any deploy type` 保持原逻辑。
- [ ] `AliCloud + Shared(Serverless/Starter/Essential)` 走 AliCloud invoke strategy。
- [ ] global 继续透传现有 `Credential`，不新增新字段。
- [ ] regional URL 切换为带 `{provider}` 的 host。
- [ ] 不改现有 account 获取逻辑语义。

验收：

- [ ] AWS 路径行为不变。
- [ ] AliCloud 路径不要求 `ResolvedConnection`。

## 5. Global Unsupported 收口

- [ ] `privatelink` 相关能力在 global 直接返回 `unsupported`。
- [ ] `custom-domain` 相关能力在 global 直接返回 `unsupported`。
- [ ] `dataapp-log query/download` 在 global 直接返回 `unsupported`。
- [ ] `dataapp-metrics query` 在 global 直接返回 `unsupported`。
- [ ] 不依赖 regional `dataapi_control` 返回 `unsupported`。

验收：

- [ ] AliCloud Serverless 不部署 `dataapi_control` 也不会影响 SQL 主链路。
- [ ] 非 V2 能力在 global 得到稳定错误。

## 6. 测试

- [ ] 为 static route provider 增加单测。
- [ ] 为 local session driver 增加单测。
- [ ] 为 single executor dispatch strategy 增加单测。
- [ ] 为 global provider selector 增加单测。
- [ ] 为 provider-aware URL builder 增加单测。
- [ ] 为 AWS 路径增加回归测试，确认不受影响。
- [ ] 为 AliCloud 增加集成验证：
  - `CreateSession`
  - `ExecSqlWithSession`
  - `CloseSession`
  - `GetDatabaseMeta`
  - executor 重启后 session 失效
  - unsupported API 在 global 返回正确错误

## 7. 实施顺序

- [ ] 第一步：配置与 runtime profile。
- [ ] 第二步：executor static route provider + local session。
- [ ] 第三步：gateway single-executor dispatch。
- [ ] 第四步：global provider-aware strategy + URL。
- [ ] 第五步：global unsupported 收口。
- [ ] 第六步：回归 AWS、验证 AliCloud。
