服务端系统设计 模板
这里以 CRM 项目的用户触达模块为例,给大家分享一下。
# CRM 技术设计文档「消息触达模块」
项目名称 | CRM 系统 |
---|---|
项目负责人 | @张三 |
模块名称 | 用户触达模块 |
模块负责人 | @李四 |
# 1. 修订记录
版本 | 修订人 | 修订内容 | 修订日期 |
---|---|---|---|
v1.0 | @张三 | 创建 | 2022-12-23 |
# 2. 需求/背景
产品文档:xxx
为了实现用户的精细化运营,通过多种途径,向用户发送消息通知……
# 3. 设计目标
# 3.1 实现功能
- 多种渠道给用户推送消息,主要包含站内和站外两大部分:
- 站内:
- 站内信
- 弹屏
- 站外
- 邮箱
- 短信
- push
- 微信
- ……
- 触达任务
- 支持定时/延时消息发送
- 支持触发型消息发送
- 支持用户分群发送
功能点比较多的话,可以用思维导图的形式来整理。
# 3.2 设计指标
- 性能指标
- 百万级消息分钟级发送完成
- xx接口,性能指标:单机 1000 并发,95%响应 <= 200ms
- ……
- 可用性
- 触达模块 99.9% 可用
- 消息推送成功率 80% 以上
- ……
- 扩展性
- 采用策略模式+配置,新增消息渠道,只需少量代码+代码即可实现。
- 引入规则引擎,统一消息类型的不同渠道,可以通过规则调整,无需发版。
- ……
- 兼容性
- 接口xxx向前兼容 APP 1.9.0 版本,低版本需强制更新。
- 可观测性
- 接入 Prometheus 和 Grafana,对服务和业务进行监控
- 服务监控:通过控制面板观察服务的内存、CPU、JVM、接口 QPS、接口 RT …… = 业务监控:通过埋点上报,收集用户触达数据,通过面板可以分设备、渠道查看用户触达成功率 ……
- 告警
- 通过 Prometheus Alert 实现服务的告警,告警信息分级别,进行飞书通知、电话通知、告警类型分为服务告警和业务告警。
- 服务告警:内存、CPU 占用过高、接口 QPS 过高、接口 RT 过长,触发告警
- 业务告警:用户触达成功率过低告警
# 4. 概要设计
# 4.1 设计思路
- 数百万消息短时间发送完成,流量较大,对数据存储性能要求较高,需要选用高性能 DB,对存储压力也比较大,同时需要一定削峰处理。
- 定时/延时消息发送采用消息队列完成,对 MQ 的消费要求较高,并发度要高,批量消费。
- ……
# 4.2 技术选型
- 存储:TiDB
- 缓存:Redis
- 消息队列:业务 RocketMQ、埋点 Kafka
- 注册中心:Nacos
- 配置中心:Nacos
- RPC:Dubbo
- 网关:Gateway
- Push通道:自建
- ……
# 4.3 业务架构
待补充
# 4.4 技术架构
待补充
# 4.5 系统环境
JDK 版本:11
部署环境:k8s + Container,单 pod 8 核 CPU + 4G 内存,服务集群 32 个 pod
数据库
- 业务数据:TiDB 64核 CPU + 128G 内存
- 离线数据:Hbase ……
- ……
……
# 5. 详细设计
详细设计,是具体指导开发的设计部分,包括:流程、数据模型、算法、客户端的接口等等。
# 5.1 流程设计
- push 流程
待补充
- Alipay 接入时序图
待补充
# 5.2 算法设计
- 渠道分流:同一消息类型、多种渠道,支持按比例分流,采用加权随机算法实现。
- ……
# 5.3 数据模型设计
- crm_user_toutch_tash:用户触达任务表
字段 | 数据类型 | 描述 |
---|---|---|
id | bigint | 主键 |
task_no | bigint | 任务编号 |
comment | varchar | 描述 |
…… |
# 5.4 接口设计
接口名称 | 添加支付任务 |
---|---|
接口文档地址 | https://yapi.comn/xxx |
入参 | |
入参描述 | |
出参 | |
出参描述 |
# 5.5 异常处理
- 系统中的不确定异常,进行统一处理,响应"Network Error"
- 埋点异步发送,不影响主要功能 _ ……
异常处理也是需要考虑的地方,哪些异常可以吞掉,哪些异常需要降级,怎么到日志等。
# 6. 风险评估
# 6.1 已知风险
- 对数据相关服务压力较大,用户分群、用户画像等数据服务崩溃风险
- MQ 存在堆积风险,导致用户收到消息延迟
- QPS 较高,数据库 CPU 飙升风险
- ……
# 6.2 可能风险
- 场景类消息延迟,可能会影响交易相关流程,拉低转化率和成交率
- ……
# 7. 测试建议
需求评审、设计阶段,都需要拉上测试同学,测试同学要对整体功能、性能,有比较清楚的了解。由于具体实现逻辑,开发会比较清楚,因此需要给测试同学一些建议,给测试的测试用例提供参考。
# 7.1 功能测试
功能 | 测试步骤 | 预期结果 |
---|---|---|
定时消息发送 | 创建定时消息 | 消息定时发送 |
…… |
# 7.2 性能测试
- xxx接口压测,预估单机 QPS 1000。
# 8. 上线准备
- 运维搭建环境
- 数据初始化
- 添加配置
- 消息队列创建
- 依赖服务上线
- 服务上线
# 9. 评审意见
评审意见 | 提出人 | 提出日期 | 解决意见 | 解决人 | 解决日期 |
---|---|---|---|---|---|
xxx接口需要考虑一下兼容性,建议xx字段,从object改为list | @李四 | 2023-01-02 | 修改字段类型 | @张三 | 2023-02-01 |
…… |
上次更新: 2023/01/31, 17:37:12