跳转至

SMS 持久化可行性分析

分析日期:2026-02-14

所属阶段:Phase 1.5(数据基础增强) 前置条件:无(可独立实施) 相关文档PhoneBook 数据库 · 产品闭环分析

现状

当前 SMS 消息采用临时缓存策略:

用户查看SMS → studio-api Lambda → DynamoDB 缓存(10分钟TTL)→ RingCentral API
  • 缓存表studio-Cache-{env}(DynamoDB)
  • 缓存 Key 格式MSG#{storeId}#{queryHash}
  • 三层缓存:内存(5分钟)→ DynamoDB(10分钟)→ RingCentral API
  • 代码位置studio-api/apps/api/src/services/message-cache.ts

存在的问题

问题 影响
缓存 10 分钟过期后重新调 API 响应慢、浪费 API 配额
受 RingCentral API 限速影响 高并发时 SMS 页面加载失败
RingCentral 服务不可用时无法查看历史 业务中断风险
缓存按查询整包存储 不同查询条件产生重复数据,空间浪费

核心矛盾:SMS 是高频使用功能,但数据完全依赖第三方 API 实时拉取,没有自主存储。

2. 代价

2.1 开发成本

步骤 工作量 难度
CDK 新建 DynamoDB 表 0.5 天
WebhookReceiver 增加 SMS 写入逻辑 1 天
studio-api 查询改为读新表 1-2 天
历史数据回填脚本 1 天
移除旧缓存逻辑 0.5 天
合计 4-5 天

2.2 基础设施成本

项目 现在(缓存模式) 持久化后
DynamoDB 存储 缓存 10 分钟后删除,数据量极小 永久存储,但 SMS 文本数据量很小(几千条/月 ≈ 几 MB)
DynamoDB 写入 每次用户查询都写缓存 只在新 SMS 来时写一次,更少
DynamoDB 读取 差不多 差不多
RingCentral API 调用 缓存过期后频繁调用 几乎不调,显著减少
总计 基准 持平或更低(约 $0-2/月增量)

2.3 运维成本

  • 无新增运维负担:使用现有 DynamoDB + Lambda 基础设施
  • Webhook 管道已有,只是新增一个事件类型的处理

3. 收益

收益 说明
查询更快 直接读 DynamoDB(<10ms),无需等 RingCentral API 响应(200-500ms)
不受限速 不再依赖 RingCentral API 做 SMS 查询,高并发无问题
高可用 RingCentral 故障时历史消息仍可查看
数据自主 SMS 数据掌握在自己手中,便于后续做搜索、分析、导出等功能
完善客户画像 SMS 持久化后可补充 PhoneBook 的 SMS 维度,完善客户 360 视图

4. 重要性

。SMS 持久化可增强以下功能:

  • PhoneBook 的 SMS 维度:持久化后 PhoneBook 可关联完整的 SMS 历史,而非仅统计计数
  • 客户 360 视图:需要将 SMS 记录与通话、线索关联展示
  • 报表分析:需要 SMS 交互数据参与统计

注意:PhoneBook 不依赖 SMS 持久化即可独立实施(通话 + 线索已足够),但 SMS 持久化可补全客户画像的短信维度。

5. 紧迫性

。建议在 PhoneBook 之后实施。

时间因素 评估
当前是否有生产问题? 有——RingCentral API 偶发限速导致 SMS 页面加载慢
是否阻塞其他计划? 否——PhoneBook 可独立实施,SMS 持久化可后续补充
是否有外部截止日期? 无,但越早做越多数据被保留
技术债务风险 低——改动范围小,不会引入新技术栈

6. 风险分析

风险 概率 影响 对策
历史回填时触发 RingCentral API 限速 限制回填速率(如每秒 5 次),使用指数退避
Webhook 事件丢失导致 SMS 缺失 设置定时对账任务,周期性从 API 补漏
新表 Schema 设计不当导致后续返工 参考成熟的 SMS 数据模型,预留扩展字段
与现有缓存逻辑并行期间数据不一致 上线后先双写观察,确认无误后移除旧缓存

总体风险:低。现有基础设施(Webhook、DynamoDB、CDK)均已就绪,无技术探索成本。

7. 实施计划

7.1 数据写入:利用现有 Webhook 基础设施

系统已有 WebhookReceiver Lambda 接收 RingCentral 事件。SMS 事件走同样的路:

RingCentral 发送SMS事件通知
WebhookReceiver Lambda(已有)
新增:写入 SMS 持久化表(DynamoDB)
后续查询直接读 DynamoDB,不再调 RingCentral API

7.2 数据存储:新建独立 DynamoDB 表

字段 说明
PK STORE#{storeId}
SK MSG#{creationTime}#{messageId}
messageId RingCentral 消息唯一ID(用于去重)
direction inbound / outbound
phoneNumber 对方号码
subject 消息内容
conversationId 会话ID
readStatus 已读/未读
creationTime 消息创建时间
TTL 无(永久存储)

7.3 实施步骤

阶段 步骤 难度 说明
第 1 周 CDK 新建 DynamoDB 表 在 studio-api infra 中加表定义
第 1 周 WebhookReceiver 增加 SMS 写入逻辑 识别 SMS 事件类型,写入新表
第 2 周 studio-api 查询改为读新表 改查询逻辑,优先查持久化表
第 2 周 历史数据回填 一次性从 RingCentral API 拉取历史 SMS 存入
第 3 周 移除旧缓存逻辑 持久化上线后,SMS 缓存可以去掉

8. 结论

推荐实施

维度 评估
开发成本 低(4-5 天)
基础设施成本 持平或更低
技术风险
收益 高(性能提升 + 高可用 + 数据自主)
依赖关系 无硬依赖;可补全 PhoneBook 的 SMS 维度和客户 360 视图
  • 查询更快:直接读 DynamoDB,无需等 RingCentral API 响应
  • 不受限速:不再依赖 RingCentral API 做 SMS 查询
  • 高可用:RingCentral 故障时历史消息仍可查看
  • 数据自主:SMS 数据掌握在自己手中,便于后续做分析、搜索等功能

风险

  • 无明显风险:现有基础设施(Webhook、DynamoDB、CDK)均已就绪
  • 唯一注意点:历史回填时需控制 RingCentral API 调用频率,避免一次性拉取过多

与其他计划的关联

CUSTOMER_HISTORY v2

产品闭环分析指出:当前 AI 分析 prompt 中的 CUSTOMER_HISTORY 只包含通话数据,不包含 SMS。原因正是 SMS 没有持久化(见闭环分析第五节注释)。

SMS 持久化完成后,可以实现 CUSTOMER_HISTORY v2——在 AI 分析 prompt 中注入最近的 SMS 交互记录,让 AI 了解客户的完整沟通历史(不仅是电话,还有短信)。

PhoneBook 客户档案

PhoneBook 数据库设计中包含 smsCount 字段(短信条数)。SMS 持久化是 PhoneBook smsCount 准确计算的前提。两个方案建议在 Phase 1.5 中同步实施。

结论

推荐实施。技术难度低、费用不增反降、收益明确。核心改动集中在 WebhookReceiverstudio-api 两处,现有架构完全支持。建议在 PhoneBook 实施完成后作为第二优先级启动。