团队的技术专家回老家了,留下的技术设计模板贼好用

2023-11-10

大家好,我是老三,转眼间,团队的技术专家B哥,已经离职一年了,我还时不时会想起他,因为他留下的j技术设计模版,我觉得真的很好用,基本上涵盖了设计需要考虑的方方面面。接下来,以一个CRM项目的用户触达模块为例,给大家分享一下。

一、CRM_技术设计文档_消息触达模块

项目名称 CRM系统
项目负责人 三分恶
模块名称 用户触达模块
模块负责人 三分恶

老三说:第一部分主要说明项目或者模块的概况,这一部分虽然不太重要,但是是必须的。

二、修订记录

版本 修订人 修订内容 修订日期
V1.0 三分恶 创建 2022-12-23

老三说:技术设计不是一成不变的,经常会随着业务的变化,或者根据遇到的一些问题,进行完善和优化,但是每一个版本,都应该留下记录和备份。

三、需求/背景

产品文档:xxxx

为了实现用户的精细化运营,通过多种途径,向用户发送消息通知……

老三说:这一部分就是结合产品文档,把需求/背景简单提炼一下,必须,但不是重点。

四、设计目标

老三说:设计目标一般分为两部分:

  • 实现功能:这一部分就是就是分析需求,把产品文档里的东西,拆解成一个个的功能,也就是CRUD。
  • 设计指标:CRUD也有区别,一把梭,随便写也能实现功能,但是我们CRUD也得有点追求,而且面向C端用户的系统,也基本上会有一些性能、可用性之类的要求,比如接口响应平均多少多少毫秒以下、单机QPS1000、系统几个9可用……

4.1.实现功能

  1. 多种渠道给用户推送消息,主要包含站内和站外两大部分:
  • 站内:
    • 站内信
    • 弹屏
  • 站外:
    • 邮件
    • 短信
    • push
    • 微信
    • ……
  1. 触达任务管理
  • 支持定时/延时消息发送
  • 支持触发型消息发送
  • 支持用户分群发送

……

老三说:功能点比较多的话,这一部分还可以用思维导图的形式来整理。

思维导图

老三说:这一部分评审的时候一定要拉上产品经理或者相关的业务方,确定功能点没有错漏。

4.2.设计指标

  1. 性能要求
  • 百万级消息分钟级发送完成
  • xx接口,性能指标:单机1000并发,95%响应<=200ms

……

老三说:一般C端的服务都是有比较严格的性能要求的,毕竟如果系统响应慢的话,用户的流失率就会变高。当然,用户触达,其实主要在于推,用户主动查会少一些,消息的推送通常也会要求速度,比如,有个网红,九点钟要在app上直播,直播开始的时候,要做一个推送,那就要求尽可能快地把消息推送给每个用户,不能说等到十二点直播完了,有的用户才收到消息。

  1. 可用性
  • 触达模块99.9%可用
  • 消息推送成功率80%以上

……

老三说:C端系统的可用性比较重要,毕竟挂一会,影响的用户可能都是以万计,所以,设计的时候,也要考虑可用性,分析系统的瓶颈在哪里,流量突然上来,哪里可能顶不住,是要扩容,还是要限流、熔断降级……

  1. 扩展性
  • 采用策略模式+配置,新增消息渠道,只需少量代码+代码即可实现
  • 引入规则引擎,同一消息类型的不同渠道,可以通过规则调整,无需发版

……

老三说:这一部分也是设计中应当考虑的,不能一味求快,否则很容易堆屎山。

  1. 兼容性
  • 接口xxx向前兼容app 1.9.0版本,低版本需强制更新

……

老三说:C端系统的开发,有时候比较麻的是低版本app的兼容,尽可能早期设计的时候,就考虑可能的扩展,如果实在没法兼容,那就只能app强制更新,当然这种用户体验就非常不好了。

  1. 可观测性
  • 接入Prometheus和Grafana,对服务和业务进行监控
    • 服务监控:通过控制面板观察服务的内存、CPU、JVM、接口QPS、接口RT……
    • 业务监控:通过埋点上报,收集用户触达数据,通过面板可以分设备、渠道查看用户触达成功率……

老三说:这一部分也很重要,我们一般上班的第一件事,就是看监控面板,分析有没有什么异常的地方。服务的可观测性,一般公司都是用一些开源的或者付费的监控平台,大厂一般都会自研监控平台。服务的监控很多是通过插桩来实现,业务的监控一般都需要打埋点。

  1. 告警
  • 通过PrometheusAlert实现服务的告警,告警信息分级别,进行飞书通知、电话通知,告警类型分为服务告警和业务告警
    • 服务告警:内存、CPU占用过高,接口QPS过多,接口RT过长,触发告警
    • 业务告警:用户触达成功率过低告警

老三说:告警通常也是和监控在一起的,毕竟开发人员也不可能二十四小时盯着告警,一般开源的、付费的、自建的监控系统,都支持配置告警规则,并通过不同的方式,邮件、短信、电话之类的渠道进行通知。

五、概要设计

老三说:概要设计,就是做个大概的系统整体设计。

5.1.设计思路

  • 数百万消息段时间发送完成,流量较大,对数据存储性能要求较高,需要选用高性能DB,对存储压力也比较大,同时需要一定削峰处理
  • 定时/延时消息发送采用消息队列实现,对MQ的消费要求较高,并发度要高,批量消费
  • ……

老三说:这一部分主要是梳理一下整体的开发设计思路,把一些零散的想法梳理成点或者面,前期大家的讨论可以整理在这里。

5.2.技术选型

  • 存储:TiDB
  • 缓存:Redis
  • 消息队列:业务RocketMQ,埋点Kafka
  • 注册中心:Nacos
  • 配置中心:Nacos
  • RPC:Dubbo
  • 网关:Gateway
  • Push通道:自建

……

老三说:这一部分就是大概定一下技术选型,其实要是整个项目做好了选型,这一部分也可以不做,一般需要高级技术人员或者架构师,来整体地进行把握,当然,很多时候选型也没好选的,基本就是主流的那些,而且一般一个团队,都是统一的技术选型,方便维护。

5.3.业务架构

业务架构

老三说:这一部分就是大概对功能分分层,分分块,把大概的功能切一切。

5.4.技术架构

老三说:技术选型+业务架构,其实一个大概的技术架构就出来了。

技术架构

老三说:技术架构图类型,其实也没有特别固定的形式,主要是图能达意,我这个图是通过draw.io画的,还有一些其它的还用的工具,比如大家应该都听过“PPT架构师”,用PPT画也是可以的。当然这个图是我随手画的。

5.5.系统环境

  • JDK版本:11
  • 部署环境:k8s+Containerd,单pod8核CPU+4G内存,服务集群32个pod
  • 数据库:
    • 业务数据:TiDB 64核CPU+128G内存
    • 离线数据:Hbase……
  • ……

老三说:如果是项目初建,一般还需要对系统的环境进行评估,根据技术选型、数据容量、系统QPS等等,来选择系统的环境,这一部分一般评审的时候会拉上运维同学,提前确定好系统环境,和运维同学对齐需求和排期。

六、详细设计

老三说:详细设计,就是具体指导开发的设计部分了,包括流程啊、数据模型啊、具体用到的算法、和客户端的接口,等等,这一部分很重要,如果没做好,没对齐,那么搞不好就要返工,耽误进度。

6.1.流程设计

  • push流程

push流程

老三说:用户触达,业务流程基本比较简单,对于一些交易类的,比如支付,或者B端的系统,比如ERP,在开始开发之前,流程一定要梳理清楚,一般通过流程图、时序图来描述业务流程。给大家看一下我之前对接alipay画的简单的时序图:

Alipay接入时序图

6.2.算法设计

  • 渠道分流:同一消息类型,多种渠道,支持按比例分流,采用加权随机算法实现
  • ……

老三说:算法设置不一定数据结构相关的算法,代码里的一些涉及到一些需要进行逻辑计算的,都可以称之为算法,这一部分也可以先梳理一下。

6.3.数据模型设计

  • crm_user_toutch_tash:用户触达任务表
字段 描述 数据类型
id 主键 bigint
task_no 任务编号 bigint
comment 描述 varchar
……

老三说:数据模型设计非常重要,可以说是系统设计的根基,如果没有设计好,开发和维护起来真的很痛苦,每个公司应该都有一定的数据库设计规范,基本就是结合业务和规范来设计了。

具体用什么工具设计呢?业务比较简单的C端系统,其实直接拿表格也行,之前也试过PdMan,还行吧。

6.4.接口设计

接口名称 添加支付任务
接口文档地址 https://yapi.com/xxx
入参
入参描述 comment:任务描述
出参
出参描

老三说:这一部分也是重量级,但凡涉及到客户端,或者其它服务的,这一部分都少不了,一般可以通过YApai之类的接口工具,但是建议大家还是在文档里做个重复工作,把入参出参之类的描述一下,有些地方标标重点,因为有些人真的不怎么会看文档。

接口设计的时候一定要和相关的同学对齐,不要怕花时间,后期改接口,是一件很痛苦的事情。

6.5.异常处理

  • 系统中的不确定异常,进行统一处理,响应“Network Error”
  • 埋点异步发送,不影响主要功能
  • ……

老三说:异常处理也是需要考虑的地方,哪些异常可以吞掉降级,哪些没法处理,怎么给客户端展示,怎么打日志,都需要考虑。

七、风险评估

老三说:其实每一次上线都伴随着风险,从设计,一直到上线之前,都要对存在的风险进行评估,上线了要重点观察风险点,也要提前设计好回滚或者处理方案,一旦发现不对劲,及时回滚和处理。

7.1.已知风险

  • 对数据相关服务压力较大,用户分群、用户画像等数据服务崩溃风险
  • MQ存在堆积风险,导致用户收到消息延迟
  • QPS较高,数据库CPU飙升风险
  • ……

7.2.可能风险

  • 场景类消息延迟,可能会影响交易相关流程,拉低转化率和成交率

……

八、测试建议

老三说:需求评审阶段、设计评审阶段,最好都拉上测试同学,测试同学要对整体的功能,还有性能,都有比较清楚的了解。但是啊,如果只看功能的话,可能就是表面的点点点,具体实现逻辑,还是开发比较清楚,所以说给测试同学提一些测试建议,给测试的测试用例提供参考。

同时,我个人觉得,从测试的角度进行思考,也能有效减少写代码的bug。

8.1.功能测试

功能 测试步骤 预期结果
定时消息发送 创建定时消息 消息定时发送
……

老三说:这一部分基本就是结合设计目标的实现功能,列一下测试步骤和预期结果

8.2.性能测试

  • xxx接口压测,预估单机QPS1000

这一部分基本就是压测了,很多时候,系统的压测没那么简单,尤其是链路长的时候,压一次都得兴师动众。

九、上线准备

  • 运维搭建环境
  • 数据初始化
  • 添加配置
  • 消息队列创建
  • 依赖服务上线
  • 服务上线

老三说:这一部分算是上线的备忘吧,有些wiki类的工具,支持在文档里建任务,把上线前需要做的事情列出来,有不知道你经历过“测试环境猛如虎,上线一看原地杵”没?可能就是上线准备没做好,缺了什么,少了什么。

十、评审及意见

评审意见 提出人 提出日期 解决意见 解决人 解决日期
xxx接口需要考虑一下兼容性,建议xx字段,从object改为list 老六 2023年1月1日 修改字段类型 老三 2023年1月1日
……

老三说:设计文档不是写完,啪,丢出去就完事了,还要上设计评审会,评审的时候,通常相关同学会提出一些评审意见,这些都应该记录下来,解决完了之后,再次评审,直到评审通过,然后就可以开始CRUD了。



好了,看完这个模板,想必你对技术设计也有一定的认识了,老三实际上没怎么接触过用户运营相关的东西,所以内容大家随便看看,主要看模板。

当然模板是相对固定的,但是设计是灵活的,做技术设计的时候,也不用拘泥于固定的形式,根据具体的需求,考虑到需要考虑的点,能做到设计指导开发就够了。

那么,假如你已经能做好技术设计……

但是——

老板:三某,这个需求,三天能不能搞定?

老三:可能不太……

老板:这个需求很急,而且我不能不急,你懂我的意思吧?

老三:没问题,三天够了!

而且——

老板:呦,三某的文档写的很清晰,代码也很优雅,今年公司绩效不好,找个实习生把他替了吧。

……

绷不住



参考:

[1].用户运营:触达系统应该如何搭建

[2].一个实时精准触达系统的自我修养


文章首发,技术资源,欢迎关注⬇️⬇️⬇️
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

团队的技术专家回老家了,留下的技术设计模板贼好用 的相关文章

  • 使用 objectGUID 进行查询 - Spring LDAP 模板

    我正在尝试获取 存储并依次使用 objectGUID 来查询 Active Directory 为了获取用户属性我正在使用以下 public static class MyDnKeyValueAttMapper implements Att
  • 按下按钮时清除编辑文本焦点并隐藏键盘

    我正在制作一个带有编辑文本和按钮的应用程序 当我在 edittext 中输入内容然后单击按钮时 我希望键盘和焦点在 edittext 上消失 但我似乎无法做到这一点 我在 XML 中插入了这两行代码 android focusable tr
  • 警告:跳过条目,因为它不是绝对 URI。 NetBeans 中的 GlassFish

    我成功安装了 GlassFish 但是 当我启动服务器时 我收到两条警告消息 警告 跳过条目 因为它不是绝对 URI 那是关于什么的 Launching GlassFish on Felix platform Aug 09 2014 10
  • 将 JSON Map 传递到 Spring MVC 控制器

    我正在尝试将 Map 的 JSON 表示形式作为 POST 参数发送到我的控制器中 RequestMapping value search do method RequestMethod GET consumes application j
  • 我需要显式关闭连接吗?

    我持有一个实例MongoClient and DB在我的应用程序中 每次我想执行某些操作时 我都会调用getCollection 我想知道是否需要显式关闭连接 就像connection close 在 JDBC 中 强调一下 我只有一个Mo
  • 总结二维数组

    鉴于我当前的程序 我希望它在用户输入所有值后计算每列和每行的总和 我当前的代码似乎只是将数组的值加倍 这不是我想要做的 例如 如果用户输入具有以下值 1 2 3 2 3 4 3 4 5 的 3x3 矩阵 则看起来就像我在下面的程序中对其进行
  • Ant 无法启动,给出主类错误

    我正在运行 Elementary OS 基于 Ubuntu 12 并且在运行 apache ant 时遇到问题 它在重新启动之前就可以正常工作 所以我不确定会发生什么变化 我在 etc environment 中定义了环境变量 如下所示 P
  • 使用 CrudRepository 进行自定义查询

    我想使用 CrudRepository 自定义查询 这是我的代码 Repository public interface CustomerRepository extends CrudRepository
  • Java 7 中 Object 和 int 的比较

    最近我偶然发现了一个问题 让我停下来思考 对我来说 下面的代码应该总是会触发错误 但是当我的一位同事问我为什么 Eclipse 没有显示错误时 我无法回答任何问题 class A public static void main String
  • 在Spring-Boot中,我们如何在同一个项目中连接两个数据库(Mysql数据库和MongoDB)?

    我正在尝试创建一个 Spring Boot 项目 其中我有一个要求 我想连接到不同的数据库 MySql 和 MongoDB 我是否需要做一些特殊的事情来连接到这两个数据库 或者 spring boot 会自动计算出自己连接到这两个数据库 我
  • java Runtime.getRunTime().exec 和通配符?

    我正在尝试使用删除垃圾文件 Process p Runtime getRuntime exec 只要我不使用通配符 它 就可以正常工作 即 Process p Runtime getRuntime exec bin rm f specifi
  • 将变量从 jenkins 传递到 testng.xml

    我想根据从詹金斯传递的变量运行测试用例 例如 选择您要运行的测试用例 测试用例一 测试用例二 在 pom xml maven 中
  • Apache Kafka 是否提供异步订阅回调 API?

    我的项目正在将 Apache Kafka 视为老化的基于 JMS 的消息传递方法的潜在替代品 为了让这个过渡尽可能的顺利 如果替代的排队系统 Kafka 有一个异步订阅机制那就更理想了 类似于我们当前项目使用的JMS机制MessageLis
  • Microsoft JDBC 中的 JTDS 属性相当于什么?

    我正在将 JTDS 连接更改为 Microsoft JDBC 并且我看到存在于http jtds sourceforge net faq html http jtds sourceforge net faq htmlMicrosoft JD
  • Java 相当于 Python 的 urllib.urlencode(基于 HashMap 的 UrlEncode)

    From https stackoverflow com questions 2018026 should i use urllib or urllib2 2018103 2018103 Java 中 Python 的 urllib url
  • Python 可以替代 Java 小程序吗?

    除了制作用于物理模拟 如抛射运动 重力等 的教育性 Java 小程序之外 还有其他选择吗 如果你想让它在浏览器中运行 你可以使用PyJamas http pyjs org 这是一个 Python 到 Javascript 的编译器和工具集
  • 如何隐藏或删除 Android HoneyComb 中的状态栏?

    如何隐藏或删除 Android HoneyComb 中的状态栏 每次运行应用程序时 我都会发现某些内容必须被状态栏覆盖 我尝试改变AndroidManifest xml 但没有任何改变 你不知道 它被认为是永久的屏幕装饰 就像电容式主页 菜
  • 升级到 Tomcat 8 时出现 ClassNotFoundException

    我最近将 NetBeans IDE 从 v7 3 升级到 v8 突然我的应用程序在连接到数据库时在服务器启动时抛出异常 这两个版本的 IDE 之间的唯一区别是后者使用 Tomcat 8 异常日志 javax naming NamingExc
  • Java,如何管理线程读取socket(websocket)?

    我有一个 WebSocket 服务器 我的服务器创建一个新线程来处理新连接 该线程一直处于活动状态 直到 websocket 中断 我的问题 对于 1 000 000 个连接 我需要 1 000 000 个线程 我如何通过一个线程处理多个
  • 安卓框架?

    是否有任何框架比构建 Android 应用程序更容易 您会对其中一个感兴趣吗 很快就会有 我正在开发 DroidFu 一个 Android 共享库 它将为您提供 活动 和服务 中直接提供大量实用功能 例如生成列表和错误对话框 检查 Inte

随机推荐

  • Conclusion about Scene Change Detection

    Refer to error concealment there are lost of research paper Today I want to conclude some paper about scene change detec
  • stm32f103最小系统

    STM32F103 最小系统是指使用 STM32F103 系列微控制器构建的最简单的系统 它通常包括 STM32F103 微控制器 外部存储器 如 flash 存储器或 EEPROM 外部晶振以及最少的电路元件 如电阻 电容和开关 最小系统
  • 【华为OD机试 2023 B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 7_spring-cloud-config-center

    文章目录 配置中心 使用 匹配规则 具体节点从配置中心读取配置 刷新配置 单个刷新 批量刷新 bus 使用 配置中心 spirng cloud config github 搭建 服务比较多 下发配置文件比较麻烦 服务启动时 从公共服务拉取配
  • 属于服务器操作系统的有,属于服务器操作系统的有

    属于服务器操作系统的有 内容精选 换一换 将外部镜像文件注册成云平台的私有镜像后 您可以使用该镜像创建新的云服务器 或对已有云服务器的系统进行重装和更换 本节介绍使用镜像创建云服务器的操作 您可以按照通过镜像创建云服务器中的操作指导创建弹性
  • MySQL中如何正确存储IP地址

    一 IP地址应该怎么存 在MySQL中 当存储IPv4地址时 应该使用32位的无符号整数 UNSIGNED INT 来存储IP地址 而不是使用字符串 用UNSIGNED INT类型存储IP 地址是一个4字节长的整数 如果是字符串存储IP 地
  • Firefox打不开https(SSL)加密链接的原因之一

    直接上图 firefox出现此种提示很多次了 在网上搜了很多方法 什么改配置参数 什么重新安装都没用 打开官方帮助说明一样没解决问题 后来 终于发现原来是卡巴斯基 KIS 2016 的原因 如图 KIS 设置中 附加 网络设置 扫描加密连接
  • 交叉编译工具链中GUN常用命令简介

    一 交叉编译工具链前缀 arm none linux gnueabi 二 常用命令 注 此处以汇编点亮led灯代码为例 重点掌握 1 gcc 编译命令 arm none linux gnueabi gcc c S或 c o o eg arm
  • ansible的脚本和playbook剧本

    playbooks 概述 Playbook介绍 playbook是ansible用于配置 部署 和管理被控节点的剧本 通过playbook的详细描述 执行其中的tasks 可以让远端主机达到预期的状态 playbook是由一个或多个 pla
  • python停车时间计算,时分秒计算

    小蓝将自己的车停在路边 在同一天将车开走 给定停车时间和开走时间 请问小蓝停了多长时间 输入格式 输入两行 第一行包含停车时间 第二行包含开走时间 每个时间的格式为 HH MM SS 其中 HH 表示时 值为 0 到 23 的整数 如果小于
  • 2022美赛备赛资料大全

    目录 1 美赛比赛网址及其介绍 2 美赛摘要页说明 3 美赛常用词语与语句 4 美赛翻译注意事项 5 美赛论文写作一些建议 5 1 团队方面准备 5 2 摘要表部分 5 3 评委关注点 6 组队要求 7 软件与一些建模网址参考 1 写一篇建
  • c++比double更大的数据类型_数据类型、变量和运算符

    一 数据类型 1 1 数据类型图示 java中的数据类型分为两大种类 基本数据类型和引用数据类型 整体数据类型如下图 1 2 基本数据类型 整形 字节类型 byte 短整形 short 整形 init 长整形 long 浮点型 单精度浮点型
  • 初识python 视频_#python day02 初识python 学习视频来源于 太白金星

    python day02 初识python 学习视频来源于 太白金星 知识点 安装PyCharm 设置鼠标条件字体大小 file gt settings 搜索mouse Editor gt general gt Change font si
  • Git 分支操作&存储原理浅谈

    相信大家对于 git 版本控制系统都不陌生 大部分同学在工作中都会使用到 git 他帮助我们管理我们的代码 让我们能够随心所欲的提交代码 进行不同的实验而不用担心将项目毁掉 同学们可以在工作中熟练的使用 git 进行代码提交 但是部分同学对
  • c语言 函数编程四个数相加,C语言第四章课后编程题

    1 编写程序 从键盘上输入4个整数 输出最小值 此题较为简单 只需定义一个桥梁最小值min就可以来着次比较他们的大小 2 编写一个程序 从键盘输入一个四位整数n 输出它的各位数字之和 例如n 1308 则输出12 n 3204 则输出9 这
  • UnityVR--PoolManager--对象池1

    本篇中使用的API gameObject CompareTag 标签 UnityEvent 事件管理 ObjectPool
  • GDI+ 显示GIF图像

    头文件定义 pragma once include
  • SpringBoot如何集成Mybatis呢?

    转自 SpringBoot如何集成Mybatis呢 下文笔者讲述SpringBoot集成Mybatis的方法分享 如下所示 Mybatis简介 Mybatis是一个ORM框架 ORM框架是我们操作数据库中不可缺少的一部分 Mybatis框架
  • 使用内部类报错:Cause: java.lang.IllegalArgumentException: argument type mismatch

    项目场景 使用内部类报错 Cause java lang IllegalArgumentException argument type mismatch 原因分析 由于内部类没有添加static 在执行代码过程中程序找不到Student对象
  • 团队的技术专家回老家了,留下的技术设计模板贼好用

    大家好 我是老三 转眼间 团队的技术专家B哥 已经离职一年了 我还时不时会想起他 因为他留下的j技术设计模版 我觉得真的很好用 基本上涵盖了设计需要考虑的方方面面 接下来 以一个CRM项目的用户触达模块为例 给大家分享一下 一 CRM 技术