Vocalink · Phase 1 · 高层架构 · 微服务划分 · 技术选型
| # | 目标 | 量化指标 |
|---|---|---|
| 1 | 低延迟 | 翻译端到端 P95 < 500ms |
| 2 | 高可用 | 核心服务 SLA 99.9%(月停机 < 43 分钟) |
| 3 | 可扩展 | 支持 10× 用户增长无需架构重构 |
| 4 | 可插拔 | 新增语种/国家 = 配置变更,不改代码 |
| 5 | 安全合规 | PDPA 合规 + 数据加密 + 审计通过 |
| 6 | 成本可控 | 单用户基础设施成本 < $0.15/月 |
| 原则 | 含义 | 落地 |
|---|---|---|
| 🧩 微服务化 | 按业务域拆分,独立部署/扩缩 | 10 个核心微服务(见 §3) |
| 📨 异步优先 | 非实时操作走消息队列 | Kafka 解耦 + 事件驱动 |
| 🔌 可插拔语言包 | 翻译/支付/审核按国家插件化 | 每国 = 配置 + 插件三件套 |
| 🛡️ 安全左移 | 安全在开发阶段内建,非事后补救 | SAST/DAST + 渗透测试 |
| 📊 可观测 | 所有服务默认埋点 + 日志 + 链路追踪 | Prometheus + Grafana + Jaeger |
| 🌍 多云就绪 | 不绑定单一云厂商 | AWS 主力 + GCP 备用 |
| 服务 | 职责 | 技术栈 | 语言 | 数据库 | QPS 预估 |
|---|---|---|---|---|---|
| 🔐 Auth Service | 注册/登录/Token/OTP | Node.js + Express | TypeScript | PostgreSQL | ~500 |
| 🎯 Match Service | 匹配算法/池管理/路由 | Go + gRPC | Go | Redis | ~2000 |
| 🎙️ Call Service | 通话生命周期/计费/质量 | Go + WebRTC SFU | Go | PostgreSQL | ~1000 |
| 🌐 Translate Service | ASR+MT+TTS 编排 | Python + FastAPI | Python | Redis(Cache) | ~3000 |
| 💰 Payment Service | 充值/订阅/分成/对账 | Java + Spring Boot | Java | PostgreSQL | ~200 |
| 🛡️ Safety Service | 内容审核/举报/封禁 | Python + FastAPI | Python | PostgreSQL | ~1500 |
| 👥 Social Service | 语伴关系/私聊/等级 | Node.js + Express | TypeScript | PostgreSQL | ~800 |
| 📺 Ad Service | 广告位/频次/收益上报 | Go + gRPC | Go | Redis + PG | ~2000 |
| 📊 Analytics Service | 事件采集/实时指标 | Python + Kafka | Python | Snowflake | ~5000 |
| ⚙️ Config Service | Feature Flag/AB测试/配置 | Node.js | TypeScript | Redis | ~3000 |
管理全局匹配池,执行匹配算法,撮合用户建立通话。
管理 1v1 语音通话的全生命周期:建立、维持、计费、结束、质量监控。
翻译子系统编排层。消费音频流 → 调用 ASR → 调用 MT → 推送译文。详细设计见文档 09。
统一支付入口,对接多通道,管理金币/订阅/分成/对账。自有支付底座的核心。
实时内容审核 + 异步深度审核 + 举报处理。AI 为主,人工兜底。
管理广告位、频次控制、广告 SDK 对接、收益上报。
| 层级 | 技术选型 | 说明 |
|---|---|---|
| UI 框架 | SwiftUI + UIKit 混编 | 新页面 SwiftUI,旧组件 UIKit |
| 架构模式 | MVVM + Combine | 数据绑定 + 响应式 |
| 路由 | Coordinator Pattern | 解耦页面跳转 |
| 网络层 | URLSession + WebSocket (Starscream) | REST + 实时通信 |
| WebRTC | LiveKit iOS SDK | SFU 模式通话 |
| 本地存储 | Core Data + Keychain | 缓存 + 敏感数据 |
| DI 容器 | Resolver | 依赖注入 |
| 广告 SDK | Google Mobile Ads SDK | Rewarded + Banner |
| 崩溃监控 | Sentry iOS | 实时崩溃上报 |
| 最低版本 | iOS 15.0+ | 覆盖 > 95% 设备 |
| 层级 | 技术选型 | 说明 |
|---|---|---|
| UI 框架 | Jetpack Compose + XML 混编 | 新页面 Compose,旧页面 XML |
| 架构模式 | MVVM + Coroutines + Flow | Google 推荐架构 |
| 路由 | Navigation Component | 类型安全导航 |
| 网络层 | Retrofit + OkHttp + WebSocket | REST + 实时通信 |
| WebRTC | LiveKit Android SDK | SFU 模式通话 |
| 本地存储 | Room + EncryptedSharedPreferences | 缓存 + 敏感数据 |
| DI 容器 | Hilt (Dagger) | 编译期依赖注入 |
| 广告 SDK | Google Mobile Ads SDK | Rewarded + Banner |
| 崩溃监控 | Sentry Android | 实时崩溃上报 |
| 最低版本 | Android 10+ (API 29) | 覆盖 > 90% 设备 |
| 模块 | 职责 | 依赖 |
|---|---|---|
| Core | 网络/日志/配置/工具 | 无 |
| Auth | 登录/注册/Token 管理 | Core |
| Match | 匹配 UI/逻辑/动画 | Core + Auth |
| Call | 通话页/字幕渲染/礼物 | Core + Auth + WebRTC |
| Translate | 字幕组件/翻译反馈 | Core |
| Payment | 充值页/订阅/支付 SDK | Core + Auth |
| Social | 语伴列表/私聊 | Core + Auth |
| Ads | 广告位/激励视频 | Core |
| Settings | 设置/隐私/帮助 | Core + Auth |
| 层级 | 存储 | 用途 | 数据保留 |
|---|---|---|---|
| 热数据 | Redis Cluster | 匹配池/会话/缓存/计数器 | 实时(TTL 自动过期) |
| 温数据 | PostgreSQL (RDS) | 用户/通话记录/支付/语伴关系 | 持久(90 天归档) |
| 冷数据 | S3 (归档) | 历史通话/审核日志/翻译语料 | 180 天(合规要求) |
| 分析数据 | Snowflake | BI 看板/用户行为分析/模型训练 | 无限(分区归档) |
| 表名 | 字段(核心) | 说明 |
|---|---|---|
| users | id, phone, email, nickname, avatar,母语, 目标语, vip_status, created_at | 用户主表 |
| calls | id, user_a, user_b, start_time, end_time, duration, cost_coins | 通话记录 |
| translations | id, call_id, seq, src_lang, src_text, dst_lang, dst_text, latency_ms | 翻译记录(脱敏后) |
| payments | id, user_id, amount_sgd, coins, channel, status, created_at | 支付流水 |
| subscriptions | id, user_id, plan, start_date, end_date, status | VIP 订阅 |
| gifts | id, from_user, to_user, gift_type, coins, call_id, created_at | 礼物记录 |
| buddies | id, user_a, user_b, status, created_at | 语伴关系 |
| reports | id, reporter, reported, reason, severity, status, created_at | 举报记录 |
| ad_events | id, user_id, ad_type, rewarded, amount, provider, created_at | 广告事件 |
| Topic | 生产者 | 消费者 | 用途 |
|---|---|---|---|
| audio-stream | Call Service | Translate Service | 音频流传输 |
| subtitle-out | Translate Service | Call Service → 客户端 | 翻译字幕推送 |
| call-events | Call Service | Analytics + Billing | 通话事件(开始/结束/质量) |
| translate-events | Translate Service | Analytics + 模型迭代 | 翻译事件(延迟/BLEU/反馈) |
| payment-events | Payment Service | Analytics + 对账 | 支付事件 |
| safety-events | Safety Service | Analytics + 人工审核 | 审核事件 |
| ad-events | Ad Service | Analytics + 收益 | 广告展示/点击/奖励 |
| 环境 | 用途 | 规模 | 数据 |
|---|---|---|---|
| 🌱 Dev | 开发自测 | 最小(1 节点/服务) | Mock 数据 |
| 🧪 Staging | 集成测试/UAT | 50%(生产配置) | 脱敏生产数据 |
| 🚀 Production | 正式生产 | 全量(自动扩缩) | 真实用户数据 |
| 🧬 Canary | 灰度发布验证 | 10% 生产流量 | 真实数据(只读副本) |
| 策略 | 描述 | 回滚时间 |
|---|---|---|
| 🔵 蓝绿部署 | 新版本部署到绿环境 → 切流量 → 验证 → 销毁蓝 | < 2 分钟 |
| 🐤 金丝雀发布 | 先放 5% → 25% → 50% → 100%,每步监控 | < 5 分钟 |
| 🏁 功能开关 | Config Service Feature Flag 控制,无需发版 | 即时(< 10 秒) |
| 资源 | 规格 | 月费(USD) | 备注 |
|---|---|---|---|
| EKS 集群 | 3 节点 (t3.medium) | ~$150 | K8s 控制面 |
| EC2 (微服务) | 10 服务 × 2 副本 (t3.medium) | ~$400 | 自动扩缩 |
| RDS PostgreSQL | db.t3.medium (2 实例) | ~$120 | 主从 + 只读副本 |
| ElastiCache Redis | cache.t3.medium (集群) | ~$100 | 6 节点集群 |
| Kafka (MSK) | 3 Broker (t3.medium) | ~$200 | 消息队列 |
| S3 + CloudFront | 静态资源 + CDN | ~$50 | App 资源/头像 |
| LiveKit (SFU) | 3 节点 (c5.large) | ~$250 | WebRTC 媒体 |
| 网络/安全/WAF | VPC + ALB + WAF | ~$100 | — |
| 监控/日志 | CloudWatch + Grafana Cloud | ~$80 | — |
| 合计 | — | ~$1450/月 | ~$1.74 万/年 |
注:以上为 Phase 1 初期(DAU < 5 万)估算。DAU 增长后自动扩容,成本线性增长。
| 层级 | 措施 | 技术实现 |
|---|---|---|
| 🌐 网络层 | WAF + DDoS 防护 + VPC 隔离 | AWS WAF + Shield + Security Groups |
| 🔐 传输层 | 全链路 TLS 1.3 加密 | ALB HTTPS + SRTP + WSS |
| 🗄️ 存储层 | 静态数据 AES-256 加密 | RDS KMS + S3 SSE-KMS |
| 🔑 认证层 | JWT + OAuth2 + MFA(P2) | Auth Service + AWS Cognito |
| 📋 审计层 | 全操作审计日志 + 不可篡改 | CloudTrail + S3 (WORM) |
| 🛡️ 应用层 | SAST + DAST + 依赖扫描 | GitHub CodeQL + OWASP ZAP |
| 🔍 监控层 | 异常行为检测 + 入侵检测 | GuardDuty + Splunk |
| 要求 | 实现 | PDPA 条款 |
|---|---|---|
| 数据最小化 | 仅收集必要字段(手机号/昵称/语言) | 第 16 条 |
| 用户同意 | 注册时强制阅读隐私政策 + 勾选同意 | 第 14 条 |
| 数据访问 | 用户可查看/导出/删除自己的数据 | 第 21-22 条 |
| 数据保留 | 语音不存储 / 文字 90 天 / 日志 180 天 | 第 24 条 |
| 数据出境 | Phase 1 数据不出新加坡(仅 API 调用海外) | 第 26 条 |
| 账号注销 | 30 天内彻底删除所有个人数据 | 第 21 条 |
| 阶段 | 时间 | 范围 | 通过标准 |
|---|---|---|---|
| W9 内部测试 | Phase 1 上线前 | 全部 API + 客户端 | 0 高危 0 严重 |
| W10 外部审计 | 上线前 2 周 | 第三方渗透测试 | 0 严重 / ≤ 2 高危(可修复) |
| 季度扫描 | 每季度 | 自动化漏洞扫描 | 0 新增高危 |
| 年度审计 | 每年 | 全系统深度渗透 | 0 严重 / 修复计划 |
| 风险 | 概率 | 影响 | 缓解措施 |
|---|---|---|---|
| Google API 配额不足 | 中 | 高 | W1 申请 100 万次/天配额;备选 Azure Speech |
| LiveKit 扩容瓶颈 | 低 | 高 | 自动扩缩 + 多节点;备选 MediaSoup |
| 翻译延迟超标 | 中 | 高 | 流式翻译 + 缓存 + 降级为文字模式 |
| Redis 单点故障 | 低 | 高 | Cluster 模式 + 主从 + 本地内存降级 |
| 数据库写入瓶颈 | 低 | 中 | 读写分离 + 分库分表准备 |
| 第三方 API 故障 | 中 | 中 | 多供应商冗余 + 降级方案 |
| AdMob 填充率不足 | 中 | 低 | ironSource 备用 + 自有广告位 |
| Apple 审核拒绝 | 中 | 中 | 预留 2 周缓冲 + 申诉材料准备 |
🚨 灾难恢复 RTO/RPO:
| 场景 | RTO(恢复时间) | RPO(数据丢失) | 方案 |
|---|---|---|---|
| AWS 区域故障 | < 4 小时 | < 5 分钟 | 跨 AZ 部署 + GCP 热备 |
| 数据库崩溃 | < 30 分钟 | < 1 分钟 | 自动故障转移 + PITR |
| 翻译 API 全停 | 即时 | 0(不存数据) | 降级为纯语音模式 |
| 支付通道全停 | < 1 小时 | 0(事务日志) | 暂停充值 + 补偿 VIP |
| 决策 | 选项 | 选择 | 理由 |
|---|---|---|---|
| WebRTC SFU | LiveKit vs MediaSoup vs Janus | LiveKit | 托管方案省运维 / SDK 成熟 / 新加坡节点 |
| ASR 引擎 | Google vs Azure vs 自研 | Google(zh)+Azure(en) | 各取所长 / Phase 3 统一自研 |
| MT 引擎 | Google vs DeepL vs 自研 | Google Translate | 中英 BLEU 最高 / API 稳定 |
| 消息队列 | Kafka vs RabbitMQ vs NATS | Kafka (MSK) | 高吞吐 / 持久化 / AWS 托管 |
| API Gateway | Kong vs Envoy vs AWS API GW | Kong | 插件生态 / 性能好 / 自托管灵活 |
| 数据库 | PostgreSQL vs MySQL vs MongoDB | PostgreSQL | JSON 支持 / 事务强 / 海外社区好 |
| 容器编排 | EKS vs ECS vs GKE | EKS | AWS 主力 / 团队熟悉 / 生态成熟 |
| 文档 | 关联内容 |
|---|---|
| 04 PRD 产品需求文档 | 功能需求 → 技术实现依据 |
| 09 实时翻译子系统 LLD | 翻译服务详细设计 |
| 10 API 接口规范 | 微服务间接口契约 |
| 13 支付中台接入方案 | Payment Service 详细设计 |
| 17 内容安全与审核规范 | Safety Service 规则引擎 |
| 版本 | 日期 | 修改内容 | 作者 |
|---|---|---|---|
| V1.0 | 2026-08-15 | 初始版本 | 架构团队 |