先生存,后发展!
1 业务背景
假设你现在正在一个创业公司担任 CTO,因为微信工作生活娱乐不区分,已经发生了很多次将敏感信息(可以自行脑补一下)发错人甚至发错群的尴尬事件了! 你司 CEO 决定做一款IM工具,为了区别微信和 QQ 大众化的 IM 需求,你们公司主打安全IM,这款产品的竞争力如下:主打私密聊天,严格控制私密好友的数量,而不是像微信一样,买个菜都可能要加个微信。
公司背景
- 技术团队大约10个人,后端6个,前端2个,Android 2个,ios还没有
- 后端Java 为主,大部分是P6~P7;
- 后端具备 MySQL、微服务、Redis 等开发使用经验
- 后端没有大数据和推荐相关经验
业务基本场景
- 每个用户都会通过算法生成非对称的公钥和私组
- 用户发送的消息会通过公钥加密,接收用户的消息使用自己的私钥解密
- 只能创建一对一聊天
- 聊天消息“阅后即焚最多只保留60分钟
- 无需使用手机号注册
- 每个用户最多20个好友
- 增加群聊功能,每个私密群聊限制人数为5人
- 增加支付功能,用于2个私聊用户之间转账或红包
2 总体架构思路
2.1 你的推测
老板说我们3年内要做到1千万注册用户,作为 CTO 的你应该如何做架构设计?
- 十万 落地快,但是如果业务发展很快,架构很快不适应了怎么办?
- 百万 落地慢一些,但同样面临业务发展过快的风险
- 千万 落地时间可能要6个月以上,但基本上3年内无需再动架构
2.2 分级架构
1.不同架构师的职责有什么区别?
- 总架构师(P9) 的核心职责: 1.划分业务域,2.基础技术平台完善
- 业务域架构师 (P8)的核心职责: 1,划分业务域内的微服务:2.按照用户规模设计架构.
比如全链路压测:
- 影子库+流量标识(传统)
- 容器化重新申请临时资源压测(新式)
2.感觉总架构师要运维、测试、大数据都要懂,这个怎么做到的?
但总架构师确实每个领域都要懂一些(技术广度)每个技术域需要一个P8的负责,例如:全链路压测什么时候实现? 用什么方案? 需要总架构师一起决策。
3.各个业务域内的架构,总架构师是不是不需要关注?
基本上是的,除非某个域问题很多,例如线上质量问题、开发效率问题等.
4.业务域划分是总架构师划分就可以了么?
实际上是由老板、业务方、总架构师一起讨论确定的,不单是一个技术决策,还是一个权力决策。
2.3 业务域划分粒度
三个火枪手原则的延续:一个业务域一个 P8,一个 P8 管理范围大约是30人。
为何红包属于聊天域,而不是综合域的支付服务?看业务关联度!
2.4 基础技术的“四化建设”
① 规范化
统一的各类规范,如:
- 日志规范
- 开发框架
- RPC 框架
- 接口规范
- 代码管理规范
② 平台化
基于规范实现的统一平台,如:
- 测试平台
- 运维平台
- 大数据平台
③ 自动化
统一平台自动实现各类功能,如:
- 接口自动化测试
- 全链路压测
- 故障自动分析
④ 可视化
状态、功能、操作等可视化,如:
- 系统状态可视化
- 任务管理可视化
- 任务执行可视化
2.4 基础技术的“四个核心平台”
① 运维平台
- 配置
- 部署
- 监控
- 应急
测试平台:
- 用例管理
- 资源管理
- 任务管理
- 数据管理
存储平台:
- SQL 平台
- NoSQL平台
- 小文件存储
- 大文件存储
大数据平台:
- 离线计算
- 在线计算
- 推荐系统
百万用户规模的时候难道不需要运维和测试平台吗?基本还是半人肉运维,还不是重点,所以不成熟。
千万级别特地强调,因为:
- 要求效率
- 人肉效果太差
- 没有平台,拆分架构后,各个业务混乱不堪
百万规模时,做数据分析推荐clickhouse。
4 计算架构设计
4.1 负载均衡
Nginx=>LVS=>F5:
缓存架构
5 其它架构设计
高可用架构设计
千万级用户 IM 业务,应该选择同城双活还是异地双活?先同城(六七百万)再演进到异地(四五千万)。
架构要解决的核心复杂度
- 十万:快速验证(核心需求)
- 百万:快速扩展(辅助需求)
- 千万:全面完善(基础技术)
- 亿级:全面优化(稳定、成本、开放)
百万用户架构 V.S 千万用户架构
为什么十万百万用户规模时,架构是面向需求,而到了千万却是面向技术了?
之前为了验证,后续不需要验证了,技术就要跟上了。所以要去大公司才能学到真技术。